Arrays 将矩阵单元阵列转换为二维矩阵
我有一个矩阵单元数组(Arrays 将矩阵单元阵列转换为二维矩阵,arrays,matlab,matrix,Arrays,Matlab,Matrix,我有一个矩阵单元数组(a): 我们想把它转换成一个奇异的2D矩阵,把每一列填充成相等的长度(在这个例子中是-197),然后用一种特殊的方式对它进行整形,比如{1,1}占据输出矩阵的前三列,{1,2}占据后三列,依此类推 后者可能通过horzcat实现,但我不确定当每个单元包含矩阵而不是向量时,如何填充单元阵列,我通常会使用以下内容: Lmax = max(max(cell2mat(cellfun(@numel,A,'un',0)))) ; b = cellfun(@(c)[c(:);NaN(L
a
):
我们想把它转换成一个奇异的2D矩阵,把每一列填充成相等的长度(在这个例子中是-197),然后用一种特殊的方式对它进行整形,比如{1,1}占据输出矩阵的前三列,{1,2}占据后三列,依此类推
后者可能通过horzcat
实现,但我不确定当每个单元包含矩阵而不是向量时,如何填充单元阵列,我通常会使用以下内容:
Lmax = max(max(cell2mat(cellfun(@numel,A,'un',0)))) ;
b = cellfun(@(c)[c(:);NaN(Lmax-numel(c),1)],A,'uniformoutput',0);
可以使用NaN或0填充
如何执行此操作?您需要使用
size
而不是numel
,然后对代码进行以下修改:
Lmax = max(cellfun('size',A,1));
b = cellfun(@(c)[c;NaN(Lmax-size(c,1),3)],A,'uniformoutput',0);
c = horzcat(b{:}); % this holds your final matrix
这只是对你问题先前答案的延伸 方法完全相同,现在使用矩阵而不是向量的唯一技巧是使用
size
而不是numel
。
它变成:
%// sample data
A = { randi(10,5,3) , randi(10,8,3) ; randi(10,6,3) , randi(10,3,3) }
A =
[5x3 double] [8x3 double]
[6x3 double] [3x3 double]
使用相同的方法(将numel
替换为size(…,1)
以获得正确的行数:
%%
nCol = 3 %// number of columns for the padding lines
%// get the length of the longest vector
Lmax = max(max( cellfun('size',A,1) )) ;
%// pad columns with necessary number of NaN
b = cellfun( @(c) [c ; NaN(Lmax-size(c,1),nCol)], A ,'un',0 ) ;
%// reshape if you want your cell array in columns
b = b(:).'
>> b
b =
[8x3 double] [8x3 double] [8x3 double] [8x3 double]
几乎矢量化的方法,具有的掩蔽能力-
%// Set parameters
nrows = cellfun('size',A,1)
ncols = size(A{1,1},2)
maxr = max(nrows)
%// Get mask
mask = bsxfun(@le,[1:maxr]',nrows) %//'
out = zeros(maxr*numel(nrows),ncols)
out(mask(:),:) = vertcat(A{:})
%// Final output
b = reshape(permute(reshape(out,maxr,numel(nrows),[]),[1 3 2]),maxr,[])
样本运行-
>> A{1,1}
ans =
5 6 2
6 9 1
4 7 1
4 4 2
5 8 3
>> A{1,2}
ans =
3 5 2
1 1 6
>> A{1,3}
ans =
8 5 5
9 5 1
6 3 8
9 4 1
>> A{1,4}
ans =
4 8 4
>> b
b =
5 6 2 3 5 2 8 5 5 4 8 4
6 9 1 1 1 6 9 5 1 0 0 0
4 7 1 0 0 0 6 3 8 0 0 0
4 4 2 0 0 0 9 4 1 0 0 0
5 8 3 0 0 0 0 0 0 0 0 0
所有矩阵是否都在包含3列的单元格数组中(只有行数不同)?@Hoki Yes-始终是三列,但是单元格的数量可能是可变的。@m.s更新后,我错误地标记了它。
length
非常危险。在这种情况下应该可以,但如果您知道必须获取行数,请使用size(A,1)
因为这样就不会有不确定性。或者使用内置的cellfun('size',A,1)
,应该更快。@Divakar,谢谢……也更改了它,我不知道我们可以使用这种语法。是什么让它几乎矢量化而不是完全矢量化的?@Annashumann使用cellfun('size',A,1)
ascellfun
并不是一个真正的矢量化用法,但这对性能应该是很轻的,因为它没有进行任何计算。我只是想在技术上做到正确:)