在MATLAB中

时间:2019-05-03 11:19:54

标签: matlab matrix

我有两个矩阵X (122 x 125973)和Y (1 x 125973)。我想以相同的方式将 X和Y分成较小的矩阵和Matlab中122 x 1024(列除)的向量。

我尝试了几种方法(mat2cell,循环等),但我认为我缺少语法。有帮助吗?

注意::不能将125973除以1024,因此最后一个矩阵(和向量)的大小为(122 x 21)(分别为(1 x 21))。谢谢您的帮助!

1 个答案:

答案 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中。

调用mat2cellmat2cell(X, rowDist, colDist))时,第二个参数rowDist应包含每个单元格条目的行数,每个单元格条目的行数将等于XY


或者,您可以使用循环将矩阵和向量划分为子矩阵,然后将它们放入适当的单元格中。

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);