将不同大小的数组加载到单个数组中
Loading arrays of different sizes into a single array
我有 100 个维度为 nx1 的数组。 n
因数组而异(例如,n1 = 50
、n2 = 52
、n3 = 48
等)。我想将所有这些数组组合成一个维度为 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
提前感谢社区!
您可能需要考虑使用 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
我有 100 个维度为 nx1 的数组。 n
因数组而异(例如,n1 = 50
、n2 = 52
、n3 = 48
等)。我想将所有这些数组组合成一个维度为 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
提前感谢社区!
您可能需要考虑使用 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