将不同大小的数组加载到单个数组中

Loading arrays of different sizes into a single array

我有 100 个维度为 nx1 的数组。 n 因数组而异(例如,n1 = 50n2 = 52n3 = 48 等)。我想将所有这些数组组合成一个维度为 100 x m 的数组,其中 mn 的最大值。

我 运行 遇到的问题是,随着 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 

提前感谢社区!

您可能需要考虑使用 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 recommended but hopefully that just gives you an idea as to what to do. If you did use structures, you can replace eval with something more efficient and robust like arrayfun

这是另一种没有 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));
end