2016-11-15 235 views
1

我很感興趣如何從矩陣陣列創建對角線矩陣。 我創建矩陣在MATLAB的數組:從MATLAB矩陣陣列創建對角線矩陣

X<62x62x1000>它包括1000點矩陣尺寸爲62x62

我要創建的尺寸62000x62000與來自陣列X 1000點的子矩陣沿主對角線的矩陣。

你有什麼線索如何做到這一點,除了M=blkdiag(X(:,:,1), X(:,:,2), X(:,:,3)...),因爲這將是很多寫作。

+0

https://de.mathworks.com/help/matlab/ref/ diag.html –

回答

0

您可以使用(:)索引將輸入矩陣平鋪到列向量中,然後將其傳遞到diag以沿着新矩陣的對角線放置這些元素。

result = diag(X(:)) 

這將按照列 - 主要順序(MATLAB的默認值)排列對角線上的元素。如果您需要不同的訂購,可以使用permute在展平前重新訂購尺寸。

重要的是要注意你的結果矩陣會很大。你可以使用spdiags,而不是創建一個稀疏對角矩陣

spdiags(X(:), 0, numel(X), numel(X)) 
1

一個可能的解決方案

M = kron(speye(1000),ones(62)); 
M(logical(M)) = X(:); 

隨着kron一個62000 * 62000稀疏矩陣創建M包含在其對角線上的人的1000塊,然後用X的元素替換元素。

0

一個很有爭議的eval調用可以解決這個問題很懶惰,但我懷疑有一個更好的方法來做到這一點:

evalstring = ['M=blkdiag(']; 
for i = 1:999 
    evalstring = [evalstring, 'X(:,:,', num2str(i),'),']; 
end 
evalstring = [evalstring, 'X(:,:,1000));']; 
eval(evalstring);