vector to repeated matrix multiplication
古いコメントを表示
Hi all.
Just wanted to find a non loop way of computing the following operation.
A = [1 2; 3 4], V = [ 1 2 3]
compute Y = 1*A + 2*A + 3*A = 1*[1 2; 3 4] + 2*[1 2; 3 4] + 3*[1 2; 3 4] = [6 12; 18 24]
i.e. each element of V times A then sum up each of these matrices
many thanks!
採用された回答
その他の回答 (5 件)
Matt Tearle
2011 年 2 月 22 日
Not being able to think up a more elegant solution off the top of my head, how about
reshape(repmat(A(:),1,3)*(V'),2,2)
Or, more generally and cryptically,
reshape(repmat(A(:),size(V))*(V'),size(A))
Bruno Luong
2011 年 2 月 22 日
v1 = [1 2 3]
v2 = [4 5 6]
A = [1 2; 3 4]
v2(2,:) = -1
P=sum(bsxfun(@times,v1,v2),2)
P(1)+P(2)*A % *Not* polynomial of A
Fred
2011 年 2 月 22 日
0 投票
4 件のコメント
Paulo Silva
2011 年 2 月 22 日
You can find that out using tic and toc
Matt Fig
2011 年 2 月 22 日
I suspect the BSXFUN method will be faster for smaller arrays, and REPMAT will be faster for larger arrays. For even more speed, indexing instead of REPMATing can often work magic.
Fred
2011 年 2 月 22 日
Matt Fig
2011 年 2 月 22 日
Sure, see below.
Matt Fig
2011 年 2 月 22 日
On my machine, this outputs: 3.1 2.2 1
function [] = compare_bsx()
% Compare BSXFUN, REPMAT and indexing.
T = [0 0 0];
N = 40; % The array sizes. Change this to see if the fastest changes
% with array size. It will.
for ii = 1:300
mA = ceil(rand*N); % Make the arrays up to size N.
nA = ceil(rand*N);
nV = ceil(rand*N);
A = round(rand(mA,nA)*100);
V = round(rand(1,nV)*100);
tic
E = sum(bsxfun(@times,A,reshape(V,1,1,length(V))),3);
T(1) = T(1) + toc;
tic
E2 = reshape(repmat(A(:),size(V))*(V'),size(A));
T(2) = T(2) + toc;
tic
E3 = A(:);
E3 = E3(:,ones(length(V),1,'single'));
E3 = reshape(E3*(V.'),size(A));
T(3) = T(3) + toc;
end
T/min(T) % The 1 is the quickest
カテゴリ
ヘルプ センター および File Exchange で Resizing and Reshaping Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!