vector to repeated matrix multiplication
11 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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!
0 Kommentare
Akzeptierte Antwort
Weitere Antworten (5)
Matt Tearle
am 22 Feb. 2011
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
am 22 Feb. 2011
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
0 Kommentare
Matt Fig
am 22 Feb. 2011
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
Siehe auch
Kategorien
Mehr zu Resizing and Reshaping Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!