我要解决的一个问题是创建一个Nx1单元,其中存储在其中的数据始终为N个2x2矩阵。
示例:
N = 2
mycell = cell(N,1);
for i =1:N;
mycell{i} = randi([0, 10], 2);
end
newmatrix = zeros (N+1);
所以说mycell {1}看起来像:
[3 5
2 1]
和mycell {2}看起来像:
[6 9;
3 2]
我新的零矩阵如下:
[0 0 0
0 0 0
0 0 0]
我想让它看起来像这样(在这种对角线设置中,将第一个单元格的最后一个元素与下一个单元格的第一个元素连接起来)
[3 5 0
2 7 9
0 3 2]
有没有简单的方法可以做到这一点,或者有任何内置的Matlab函数可能会有所帮助?
谢谢。
答案 0 :(得分:4)
这是基于accumarray
的解决方案。它不使用循环,适用于通用大小N
(矩阵数),R
(每个矩阵的行数)和C
(每个矩阵的列数) ):
生成示例数据(使用问题代码的概括):
N = 3; % number of matrices
R = 2; % number of rows of each matrix
C = 3; % number of columns of each matrix
mycell = cell(N,1);
for i =1:N;
mycell{i} = randi([0, 10], [R C]);
end
使用以下步骤:
accumarray
构建结果矩阵,将具有相同索引的值相加。代码:
indCol = repmat((0:N-1)*(R-1)+(1:R).', C, 1);
indRow = repelem((0:N-1)*(C-1)+(1:C).', R, 1);
newmatrix = accumarray([indCol(:) indRow(:)], reshape(cat(3, mycell{:}), 1, []));
示例结果:
>> celldisp(mycell)
mycell{1} =
3 1 2
5 6 7
mycell{2} =
7 4 2
8 0 10
mycell{3} =
1 5 0
9 10 4
>> newmatrix
newmatrix =
3 1 2 0 0 0 0
5 6 14 4 2 0 0
0 0 8 0 11 5 0
0 0 0 0 9 10 4
答案 1 :(得分:2)
我们可以执行以下操作:
N = 2
mycell = cell(N,1);
newmatrix = zeros (N+1);
for i =1:N;
mycell{i} = randi([0, 10], 2);
newmatrix(i:i+1, i:i+1) = newmatrix(i:i+1, i:i+1) + mycell{i}
end
newmatrix
mycell
这产生
newmatrix =
6 4 0
8 10 9
0 3 4
mycell =
{
[1,1] =
6 4
8 0
[2,1] =
10 9
3 4
}