Using a 3D matrix to avoid for loops

I would like to speed up my code and avoid for loops. I want to extract smaller matrices which are placed along the diagonal of a bigger matrix and put those into an array. The code looks like this:
SC = zeros(m, n, n);
for i = 1:m
SC(i, 1:n, 1:n) = matrix(n*(i-1)+1:i*n, n*(i-1)+1:i*n);
end
SC = SC(:,:,:);
Do I have to include the for loop or is there a way to extract the matrix all at once?

 采纳的回答

Matt J
Matt J 2020-6-7
编辑:Matt J 2020-6-7
First, your code should be faster if SC is nxnxm as opposed to mxnxn. That will make the memory accesses more contiguous. Assumig you accept this, then the following is a loop-free way to build SC.
B=repmat({sparse(true(n))},1,m);
idx=blkdiag(B{:});
SC=reshape( matrix(idx) ,n,n,[]);

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品

版本

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by