我有100个维数为nx1的数组。不同的数组(例如,n1 = 50、n2 = 52、n3 = 48等)的n会有所不同。我想把所有这些数组组合成一个单独的数组,它的维数是100 x m,m是n的最大值。
我遇到的问题是,当n变化时,Matlab会抛出一个错误,说维度不匹配。有没有办法绕过这个问题,这样我就可以用N/A填充“缺失”的单元格?例如,如果第一个数组包含50个元素(即n1 = 50),则如下所示:
23
31
6
...
22 第二个数组包含52个元素(即n2 = 52),如下所示:
25
85
41
...
8
12
66 结果应该是:
23 25
31 85
6 41
... ...
22 8
N/A 12
N/A 66 提前感谢社区!
发布于 2021-08-25 17:42:20
您可能想要考虑使用structure arrays来存储这样的数据集,因为在将它们合并到单个数组中时,它会使一切变得更容易。
但是为了回答你的问题,如果你有这样的数组:
a1 = 1:20; % array of size 1 x 20
n1 = numel(a1); % 20
a2 = 50:60; % array of size 1 x 11
n2 = numel(a2); % 11
... say you have nArrs arrays例如,给定nArrs数组,您可以创建所需的矩阵res,如下所示:
m = max([n1, n2, .... ]);
res = ones(m,nArrs) * nan; % initialize the result matrix w/ nan
% Manually
res(1:n1,1) = a1.';
res(1:n2,2) = a2.';
% ... so on
% Or use eval instead like this
for i = 1:nArrs
eval(['res(1:n' int2str(i) ', i) = a' int2str(i) '.'';'])
end现在请记住,使用eval是NOT推荐的,但希望这只是给你一个想法,知道该怎么做。如果你确实使用了结构,你可以用像arrayfun这样更高效、更健壮的东西来代替eval。
发布于 2021-08-25 19:52:40
这是另一种不使用eval的方法。
array_lengths = cellfun(@numel, arrays);
max_length = max(array_lengths);
result = nan(max_rows, num_arrays);
for r=1:num_arrays
result(1:array_lengths(r),r) = arrays{r}(1:array_lengths(r));
end一些解释:我假设你的数组存储在一个单元格中。下面是使用您给出的维度生成虚构数据的一些代码:
% some dummy data for your arrays.
num_arrays = 100;
primerArrayCell = num2cell(ones(1,num_arrays)); % , 1, ones(1, num_arrays));
arrays = cellfun(@(c) rand(randi(50, 1),1), primerArrayCell, 'uniformoutput',false);您可以使用带有匿名函数的cellfun来获取每个单独数组的长度:
% Assume your arrays are in a cell of arrays with the variable name arrays
array_lengths = cellfun(@numel, arrays);
max_length = max(array_lengths);分配一个nan值数组来存储结果
% initialize your data to nan's.
result = nan(max_rows, num_arrays);然后根据前面计算的数组长度填充非NaN值。
for r=1:num_arrays
result(1:array_lengths(r),r) = arrays{r}(1:array_lengths(r));
endhttps://stackoverflow.com/questions/68926999
复制相似问题