我有一个带有矩阵数组的应用程序。我必须多次操纵对角线。其他元素没有变化。我想做的事情如下:
for j=1:nj
for i=1:n
g(i,i,j) = gd(i,j)
end
end
我已经看到如何使用逻辑(eye(n))作为单个索引的单个矩阵来执行此操作,但这不适用于矩阵数组。当然有办法解决这个问题。感谢
答案 0 :(得分:4)
使用linear index,如下所示:
g = rand(3,3,2); % example data
gd = [1 4; 2 5; 3 6]; % example data. Each column will go to a diagonal
s = size(g); % size of g
ind = bsxfun(@plus, 1:s(1)+1:s(1)*s(2), (0:s(3)-1).'*s(1)*s(2)); % linear index
g(ind) = gd.'; % write values
结果:
>> g
g(:,:,1) =
1.000000000000000 0.483437118939645 0.814179952862505
0.154841697368116 2.000000000000000 0.989922194103104
0.195709075365218 0.356349047562417 3.000000000000000
g(:,:,2) =
4.000000000000000 0.585604389346560 0.279862618046844
0.802492555607293 5.000000000000000 0.610960767605581
0.272602365429990 0.551583664885735 6.000000000000000
答案 1 :(得分:0)
根据Luis Mendo的回答,根据某个人的具体目的,可能更容易修改的版本。毫无疑问,他的版本在计算上会更有效率。
g = rand(3,3,2); % example data
gd = [1 4; 2 5; 3 6]; % example data. Each column will go to a diagonal
sz = size(g); % Get size of data
sub = find(eye(sz(1))); % Find indices for 2d matrix
% Add number depending on location in third dimension.
sub = repmat(sub,sz(3),1); %
dim3 = repmat(0:sz(1)^2:prod(sz)-1, sz(1),1);
idx = sub + dim3(:);
% Replace elements.
g(idx) = gd;