How can I perform matrix operation efficiently?

11 ビュー (過去 30 日間)
Ranjan Sonalkar
Ranjan Sonalkar 2014 年 6 月 4 日
コメント済み: Dan Gianotti 2014 年 7 月 22 日
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 件のコメント
Dan Gianotti
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
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 件のコメント
Ranjan Sonalkar
Ranjan Sonalkar 2014 年 6 月 5 日
Thanks. Very nice. I was doing a loop on n (10000). I changed it to your code to loop on m (3) and this part of the code ran 600 times faster.

サインインしてコメントする。

その他の回答 (1 件)

James Tursa
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);

Community Treasure Hunt

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

Start Hunting!

Translated by