我有一個n
* m
矩陣,比如A
。我想創建以下m
* m
* n
矩陣,說B
創建對角矩陣(更高維)
for j=1:n
B(:,:,j)=diag(A(j,:));
end
如何做到這一點,而不必循環?
感謝
我有一個n
* m
矩陣,比如A
。我想創建以下m
* m
* n
矩陣,說B
創建對角矩陣(更高維)
for j=1:n
B(:,:,j)=diag(A(j,:));
end
如何做到這一點,而不必循環?
感謝
更新:我編輯的問題修復錯別字的示例代碼。
我相當確定您的示例代碼包含幾個拼寫錯誤,因爲目前矩陣A
不起作用,您的循環下標j
也不起作用。然而,你真正想要問的是:我該如何構建一個3d陣列,其中每個對角線(沿着第三維移動)都是從A
開始的一行,而不是循環?
如果這是正確的,那麼一個答案如下:
%# A loop-less solution
Soln2 = zeros(M, M, N);
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A';
基本上所有我所做的是預先分配的溶液3D陣列,然後用bsxfun
構建的所有線性指數對角線,沿着第三維移動。然後,我將A
的轉置(因爲您希望行不是列)轉換爲解決方案數組中的線性索引。
請注意,我在下面爲測試目的粘貼了一些示例代碼。請確認我對你的基於循環的解決方案的理解是你真正追求的。
%# Set some parameters and create a random matrix A
N = 3;
M = 4;
A = randi(5, N, M);
%# Your loop based solution
Soln1 = nan(M, M, N);
for n = 1:N
Soln1(:,:,n) = diag(A(n,:));
end
%# A loop-less solution
Soln2 = zeros(M, M, N);
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A';
謝謝!這正是我想要的。這太棒了。 – 2013-02-12 13:32:59
'A'是相關的?它不會出現在示例代碼中的任何地方......此外,循環的目的是什麼?循環內沒有'j'(循環下標)?!? – 2013-02-11 03:19:23
另外,與Cross-Validated不同,Stack-Overflow不能識別TeX,所以我已經將你的問題編輯爲SO上Matlab問題的一個合理的常見格式。乾杯。 – 2013-02-11 03:52:14
我的回覆解決了您的問題嗎?如果是這樣,請通過點擊我回復旁邊的勾號來標記回答的問題。乾杯。 – 2013-02-12 07:02:40