【问题标题】:Divide a matrix and its corresponding vector into submatrices and subvectors in MATLAB在MATLAB中将矩阵及其对应的向量划分为子矩阵和子向量
【发布时间】:2019-05-03 11:19:53
【问题描述】:

我有两个矩阵 X (122 x 125973) 和 Y (1 x 125973)。我想以同样的方式在 Matlab 中将 X 和 Y 拆分为 122 x 1024(列分割)的更小矩阵和向量。

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

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

【问题讨论】:

  • 您是要存储这些矩阵,还是要及时处理它们,即是否有必要同时拥有所有子矩阵?
  • 其实我想用mini-batch做神经网络,所以需要把子矩阵存放在某个地方。

标签: matlab matrix


【解决方案1】:

由于您的子矩阵大小不同,您不能将它们放入 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 或@987654334 中的行数@。


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

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

【讨论】:

  • 感谢您的回复。我认为变量 indices 会出错,因为它是在循环内定义的?我也混淆了尺寸,我需要一个分栏,对不起我的不好(请参阅编辑)。您能否编辑您的答案,以便我正式接受?
  • @U.User 在循环中声明indices 不会出错,它将被每次循环迭代覆盖。关于行划分,一个简单的解决方法是将原始矩阵转置,然后在将其放入单元格时再次转置。
  • @U.User 查看我关于如何调用mat2cell 进行列划分的更新。
  • 非常感谢您的宝贵时间和反馈!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多