I thought this would be fairly simple. I thought the diag function should be able to do this task. I have a 14x14x1045 matrix Ht, t=1,...,1045 simbolizes the number of observations. I merely want to extract the main daigonals of Ht for all t and store them in a new 3d matrix Dt which is also 14x14x1045 which contains the diagonal elements of every Ht and zeros in all other positions. However, when using the function diag(Ht) I get the following error: Error using diag First input must be 2D.
Is there a function that works like diag but for 3d matrices? I have no experience programing any functions. Could someone please provide a simple loop to make a function that fulfills this task in case no such function exists already?
I´m sorry if this question is too trivial, but I haven´t been able to find a specific answer and I seem not to be able to program such a function with my expertise level...
Thanks a lot for your help!

 채택된 답변

Matt J
Matt J 2013년 7월 9일
편집: Matt J 2013년 7월 9일

3 개 추천

D=bsxfun(@times, eye(size(H(:,:,1))), H)

댓글 수: 2

Matt J
Matt J 2013년 7월 9일
편집: Matt J 2013년 7월 9일
You could also use ndSparse (Available Here) to improve memory efficiency,
D=bsxfun(@times, ndSparse(speye(size(H(:,:,1)))), H);
Alberto Navarro
Alberto Navarro 2013년 7월 9일
Great! Thanks a lot for the super fast and efficient answer!
Best regards!

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Evan
Evan 2013년 7월 9일
편집: Evan 2013년 7월 9일

0 개 추천

A = rand(14,14,1045);
B = A(logical(repmat(eye(size(A(:,:,1))),[1 1 size(A,3)])))
Kiran Sagar
Kiran Sagar 2013년 7월 9일

0 개 추천

I think this would work elegantly. But I don't know if this would take up alot of time/memory for your purposes.
for i=1:1045
Dt(:,:,i)=diag(diag(Ht(:,:,i)));
end

댓글 수: 1

Alberto Navarro
Alberto Navarro 2013년 7월 9일
Memory/time wasn´t an issue. That worked fine as well. I solved it with the first answer, but with this one, I now know how to use the for loop in the command window. Thanks for the suggestion!

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터 및 File Exchange에서 Operating on Diagonal Matrices에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by