2017-08-10 171 views
1

我有一個矩陣數組的應用程序。我必須多次操縱對角線。其他元素不變。我想要做的事情一樣:更改矩陣數組的對角線

for j=1:nj 
    for i=1:n 
     g(i,i,j) = gd(i,j) 
    end 
end 

我已經看到了如何使用邏輯(眼(N))作爲一個單一的指標一個矩陣做到這一點,但這並不與矩陣陣列工作。當然有一個解決這個問題的辦法。由於

+0

在我自己看來,我只想創建單位矩陣,並用它來操縱對角線 –

+0

@AlexanderMcFarlane那麼請準備好答案... – Andy

回答

0

基於路易斯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; 
+0

感謝您的快速答案。我希望有一個更可讀的方式來做到這一點。我一直想要一些方法將前兩個索引合併爲一個。我想我可以重塑G,但這可能會導致大量的數據複製,因爲我不得不重新整理它。 –

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 
+0

+1:我真的努力得到一個較短的解決方案,但...我會給第二個+1使用'。'作爲轉置 – Andy

+0

@安迪謝謝!我總是使用它;我非常反對使用'''轉置,即使對於實數 –

0

我們已經在玩高爾夫碼了嗎?另一個略小,更具可讀性的解決方案

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