How can I perform matrix operation efficiently?
2 ビュー (過去 30 日間)
古いコメントを表示
I have an array X(n,m) where m<<n and n can be very large. First, I want to create a 3-d array of dimension (m,m,n) such that each mxm matrix in the nth location is the outer product of the n-th m-dimensional row in the original X- array.
Then I want to form a weighted sum all the mxm arrays where the weights are the elements of another n-dimensional array, Y(n).
result=zeros(m);
for i=1:n
result = result + Y(i) * X(i,:)' * X(i,:);
end
I could do this in the loop, but I think it would be slow when n is very large, compared to if there were a way to do all this with some matrix operation functions in MATLAB.
3 件のコメント
dpb
2014 年 6 月 4 日
Needs to preallocate the full 3D array, however, and store into it; otherwise it'll be the classic case of reallocation and memory thrashing as he adds planes.
That said, I'd think it likely to be reasonably-decent performing. The alternatives seem to be accumarray and the like which are basically loops themselves...
Dan Gianotti
2014 年 7 月 22 日
Hah! This is exactly the question I was about to ask (presumably implementing some version of the EM algorithm?)!
Did you determine if Roger's loop or James's vectorized version was faster?
採用された回答
Roger Stafford
2014 年 6 月 5 日
If m is much smaller than n and assuming Y is a column vector, try this:
R = zeros(m);
TX = X';
for ix = 1:m
R(:,ix) = TX*(X(:,ix).*Y); % <-- R is 'result'
end
その他の回答 (1 件)
James Tursa
2014 年 6 月 4 日
編集済み: James Tursa
2014 年 6 月 4 日
This is vectorized, but it creates potentially large intermediate arrays, so I don't know if it will be any faster than your simple loop. Strictly from a memory use perspective, the simple loop is better.
XT = X';
XTc = reshape(XT,m,1,n);
XTr = reshape(XT,1,m,n);
XTX = bsxfun(@times,XTc,XTr);
Yn = reshape(Y,1,1,n);
YXTX = bsxfun(@times,Yn,XTX);
result = sum(YXTX,3);
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Matrix Indexing についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!