2013-02-11 116 views
2

我有一個n * m矩陣,比如A。我想創建以下m * m * n矩陣,說B創建對角矩陣(更高維)

for j=1:n 
    B(:,:,j)=diag(A(j,:)); 
end 

如何做到這一點,而不必循環?

感謝

+1

'A'是相關的?它不會出現在示例代碼中的任何地方......此外,循環的目的是什麼?循環內沒有'j'(循環下標)?!? – 2013-02-11 03:19:23

+0

另外,與Cross-Validated不同,Stack-Overflow不能識別TeX,所以我已經將你的問題編輯爲SO上Matlab問題的一個合理的常見格式。乾杯。 – 2013-02-11 03:52:14

+0

我的回覆解決了您的問題嗎?如果是這樣,請通過點擊我回復旁邊的勾號來標記回答的問題。乾杯。 – 2013-02-12 07:02:40

回答

4

更新:我編輯的問題修復錯別字的示例代碼。

我相當確定您的示例代碼包含幾個拼寫錯誤,因爲目前矩陣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'; 
+0

謝謝!這正是我想要的。這太棒了。 – 2013-02-12 13:32:59