Evaluating svd() on slice of matrix array.
1 回表示 (過去 30 日間)
古いコメントを表示
I have an array of matrices such that
size(A) == [3, 3, 1e3]
for example. These 1000 [3x3] matrices must be orthonormal so I am attempting to project each one to the nearest orthonormal basis, using svd() and the approximation
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/262600/image.png)
This function is made to work on a single [3x3] matrix at a time however. A workaround could be using for loops like
[~,~,np] = size(A);
for i=1:np
[U,~,V] = svd(A(:,:,i));
A(:,:,i) = U*V';
end
but this function will be called very often with high numbers of matrices so I am attempting to make efficient. Is there a better way to do this?
0 件のコメント
回答 (1 件)
David Goodmanson
2020 年 1 月 23 日
編集済み: David Goodmanson
2020 年 1 月 23 日
Hi Morten
I take it that your matrices are close to being orthonomal already. Try
[Q, ~] = qr(A(:,:,i));
A(:,:,i) = Q;
which is about three times faster, not counting overhead to read and write to A(:,:,i). The result is slightly different, but of course still orthogonal.
0 件のコメント
参考
カテゴリ
Help Center および 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!