How to create a block diagonal matrix from the slices of a 3D matrix
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Mohammed
am 2 Okt. 2014
Kommentiert: Yunsong Liu
am 18 Jul. 2019
I have a large 3D matrix (K) composed of 200 slices , and I want to create a block diagonal matrix from the slices of it without looping. For example
K(:,:,1) =[1 2;3 4]
K(:,:,2) =[5 6;7 8]
K(:,:,3) =[9 10;11 12]
.
.
.
K(:,:,200) =[1 10;13 15]
if we assume the number of slice is 3, the output should be
1 2 0 0 0 0
3 4 0 0 0 0
0 0 5 6 0 0
0 0 7 8 0 0
0 0 0 0 9 10
0 0 0 0 11 12
But how the block diagonal matrix created from all the 200 slices without looping?
0 Kommentare
Akzeptierte Antwort
Azzi Abdelmalek
am 2 Okt. 2014
k(:,:,1) =[1 2;3 4]
k(:,:,2) =[5 6;7 8]
k(:,:,3) =[9 10;11 12]
q=num2cell(k,[1,2])
blkdiag(q{:})
4 Kommentare
Matt J
am 2 Okt. 2014
Note that this still uses a for-loop inside num2cell.m, though how much that hurts you, I don't know.
Note also that my 2nd answer here was the same as this, except that it returns the result in sparse form, which is normally more desirable for block diagonal matrices with small blocks.
Weitere Antworten (3)
Azzi Abdelmalek
am 2 Okt. 2014
k(:,:,1) =[1 2;3 4]
k(:,:,2) =[5 6;7 8]
k(:,:,3) =[9 10;11 12]
out=[];
for ii=1:size(k,3)
out=blkdiag(out,k(:,:,ii))
end
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!