我有一个大的2D矩阵,比如1000 × 10。我试着把这个矩阵分成多个二维矩阵。它们可以是10 × 10, 5 × 10或者23 × 10。列的大小没有改变,我根据第一列中的数字拆分它们。(在我的实际情况中,我对前两列使用这种方法。)换句话说,我把具有相同id标签的行,这是向量的第一列值。
我正试图通过for循环来实现这一点。我认为最好将它们放入'cell array'中,因为cell array允许用户拥有不同维度和不同类型的数据。所以,我想要一个单元格(1 ×变N?)其中N是被分割的矩阵的数目并且有N个不同大小的二维矩阵。
我的问题是
-
在这种情况下,我应该认为单元格是三维的吗?
-
如何初始化具有不同维度的单元格?
-
给定我有一个n × m的二维矩阵,我如何将矩阵插入到一个单元格中?
没有很多不同单元格尺寸的引用。
下面是一个简单的示例,向您展示如何将数组导出为单元格:
A=cell(2,1); % create a 2x1 cell array
A{1}=ones(3); % put a 3x3 matrix into the first cell
A{2}=rand(5); % put a 5x5 array into the second cell
A{3}=zeros(2); % grow the cell array to 3x1 and put a 2x2 matrix in the third cell
A % see what A looks like
因此您可以生长单元数组,例如在for
循环中,例如:
A=cell(5,1);
for i=1:5
A{i}= ...
end
-
在这种情况下,3D单元阵列是不可取的。只需使用一维单元格数组,并将二维数组放入其中。
-
您可以使用
myCell = cell(44,1)
初始化单元格数组 - 您可以使用
myCell{4} = data(1:23, :)
填充单元格
% Create some arbitrary data:
data = (1:1000)'*(1:10);
blockSize = 23;
% Create a cell array from scratch:
myCell2 = cell(ceil(1000/blockSize),1);
for ind = 1:ceil(1000/blockSize)
myCell2{ind} = data((ind-1)*blockSize +1 : min(ind*blockSize, end),:);
end
但是我建议避免for循环并使用函数mat2cell(...)
代替,像这样:
% Create some arbitrary data:
data = (1:1000)'*(1:10);
blockSize = 23;
% Break it up with mat2cell:
myCell = mat2cell(data, [ones(44,1)*23; 11], 10)
% And just for fun, do a calcuation:
cellfun(@norm, myCell)