我有一個矩陣數組的應用程序。我必須多次操縱對角線。其他元素不變。我想要做的事情一樣:更改矩陣數組的對角線
for j=1:nj
for i=1:n
g(i,i,j) = gd(i,j)
end
end
我已經看到了如何使用邏輯(眼(N))作爲一個單一的指標一個矩陣做到這一點,但這並不與矩陣陣列工作。當然有一個解決這個問題的辦法。由於
我有一個矩陣數組的應用程序。我必須多次操縱對角線。其他元素不變。我想要做的事情一樣:更改矩陣數組的對角線
for j=1:nj
for i=1:n
g(i,i,j) = gd(i,j)
end
end
我已經看到了如何使用邏輯(眼(N))作爲一個單一的指標一個矩陣做到這一點,但這並不與矩陣陣列工作。當然有一個解決這個問題的辦法。由於
基於路易斯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;
感謝您的快速答案。我希望有一個更可讀的方式來做到這一點。我一直想要一些方法將前兩個索引合併爲一個。我想我可以重塑G,但這可能會導致大量的數據複製,因爲我不得不重新整理它。 –
使用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:我真的努力得到一個較短的解決方案,但...我會給第二個+1使用'。'作爲轉置 – Andy
@安迪謝謝!我總是使用它;我非常反對使用'''轉置,即使對於實數 –
我們已經在玩高爾夫碼了嗎?另一個略小,更具可讀性的解決方案
g = rand(3,3,2);
gd = [1 4; 2 5; 3 6];
s = size(g);
g(find(repmat(eye(s(1)),1,1,s(3))))=gd(:)
g =
ans(:,:,1) =
1.00000 0.35565 0.69742
0.85690 2.00000 0.71275
0.87536 0.13130 3.00000
ans(:,:,2) =
4.00000 0.63031 0.32666
0.33063 5.00000 0.28597
0.80829 0.52401 6.00000
在我自己看來,我只想創建單位矩陣,並用它來操縱對角線 –
@AlexanderMcFarlane那麼請準備好答案... – Andy