首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将不同大小的数组加载到单个数组中

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

Stack Overflow用户
提问于 2021-08-25 16:53:30
回答 2查看 54关注 0票数 0

我有100个维数为nx1的数组。不同的数组(例如,n1 = 50n2 = 52n3 = 48等)的n会有所不同。我想把所有这些数组组合成一个单独的数组,它的维数是100 x mmn的最大值。

我遇到的问题是,当n变化时,Matlab会抛出一个错误,说维度不匹配。有没有办法绕过这个问题,这样我就可以用N/A填充“缺失”的单元格?例如,如果第一个数组包含50个元素(即n1 = 50),则如下所示:

代码语言:javascript
运行
复制
23    
31  
6  
...  
22   

第二个数组包含52个元素(即n2 = 52),如下所示:

代码语言:javascript
运行
复制
25    
85  
41  
...  
8  
12  
66   

结果应该是:

代码语言:javascript
运行
复制
23 25  
31 85  
6 41   
... ...  
22 8  
N/A 12  
N/A 66 

提前感谢社区!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-25 17:42:20

您可能想要考虑使用structure arrays来存储这样的数据集,因为在将它们合并到单个数组中时,它会使一切变得更容易。

但是为了回答你的问题,如果你有这样的数组:

代码语言:javascript
运行
复制
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,如下所示:

代码语言:javascript
运行
复制
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

现在请记住,使用evalNOT推荐的,但希望这只是给你一个想法,知道该怎么做。如果你确实使用了结构,你可以用像arrayfun这样更高效、更健壮的东西来代替eval

票数 0
EN

Stack Overflow用户

发布于 2021-08-25 19:52:40

这是另一种不使用eval的方法。

代码语言:javascript
运行
复制
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

一些解释:我假设你的数组存储在一个单元格中。下面是使用您给出的维度生成虚构数据的一些代码:

代码语言:javascript
运行
复制
% 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来获取每个单独数组的长度:

代码语言:javascript
运行
复制
% 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值数组来存储结果

代码语言:javascript
运行
复制
% initialize your data to nan's.
result = nan(max_rows, num_arrays);

然后根据前面计算的数组长度填充非NaN值。

代码语言:javascript
运行
复制
for r=1:num_arrays    
    result(1:array_lengths(r),r) = arrays{r}(1:array_lengths(r));
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68926999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档