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).
for i=1:n
result = result + Y(i) * X(i,:)' * X(i,:);
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'
  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