我有两个矩阵X (122 x 125973)
和Y (1 x 125973)
。我想以相同的方式将 X和Y分成较小的矩阵和Matlab中122 x 1024(列除)的向量。
我尝试了几种方法(mat2cell,循环等),但我认为我缺少语法。有帮助吗?
注意::不能将125973除以1024,因此最后一个矩阵(和向量)的大小为(122 x 21)
(分别为(1 x 21)
)。谢谢您的帮助!
答案 0 :(得分:2)
由于子矩阵的大小不相等,因此无法将它们放在3D数组中(没有NaN或零填充)。因此,您可以使用cell
。要使用mat2cell
进行此操作,您必须指定在单元格的每个单独条目中应放置多少行原始矩阵:
X = rand(122,125973);
Y = rand(1,125973);
% your number of rows per 'block'
n = 1024;
% the number of cols per cell entry:
colDist = [repelem(n, floor(size(X,2)/n)) rem(size(X,2),n)];
Xcell = mat2cell(X, size(X,1), colDist);
Ycell = mat2cell(Y, size(Y,1), colDist);
此处repelem(n, floor(size(X,2)/n))
重复n
,使n
符合X
的列数的次数。然后,我将此行末尾rem(size(X,2),n)
处的列数的其余部分追加到此行向量colDist
中。
调用mat2cell
(mat2cell(X, rowDist, colDist)
)时,第二个参数rowDist
应包含每个单元格条目的行数,每个单元格条目的行数将等于X
或Y
。
或者,您可以使用循环将矩阵和向量划分为子矩阵,然后将它们放入适当的单元格中。
Xcell = cell(ceil(size(X,2)/n),1);
Ycell = cell(ceil(size(X,2)/n),1);
% put in the blocks of n rows
for k = 1:floor(size(X,2)/n)
indices = n*(k-1)+1:n*k;
Xcell{k} = X(:,indices);
Ycell{k} = Y(:,indices);
end
% and the remainder:
Xcell{end} = X(:, indices(end)+1:end);
Ycell{end} = Y(:, indices(end)+1:end);