Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将矩阵单元阵列转换为二维矩阵_Arrays_Matlab_Matrix - Fatal编程技术网

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)
as
cellfun
并不是一个真正的矢量化用法,但这对性能应该是很轻的,因为它没有进行任何计算。我只是想在技术上做到正确:)