Multiply each element of a vector with a matrix

25 vues (au cours des 30 derniers jours)
Lars Kluken
Lars Kluken le 8 Mar 2012
I want to multiply each element of a vector with a matrix such that I end up with a 3D matrix (or higher dimentions).
For example if A is a vector and B is a matrix I would write:
for indx=1:length(A)
result(:,:,indx)=A(indx).*B
end
Is for-loops the way to go here or are there any better solutions?

Réponse acceptée

Sean de Wolski
Sean de Wolski le 8 Mar 2012
BSXFUN!!!
B = [1 2; 3 4];
A = 1:5;
D = bsxfun(@times,B,reshape(A,1,1,numel(A)));
kron is notorious (at least in older versions) for being very slow.
And obligatory timings:
B = repmat([1 2; 3 4],10,10);
A = 1:50;
t1 = 0;
t2 = 0;
t3 = 0;
for ii = 1:100
tic
C = reshape(kron(A,B),[size(B),numel(A)]);
t1=t1+toc;
tic
D = bsxfun(@times,B,reshape(A,1,1,numel(A)));
t2=t2+toc;
tic
for indx = length(A):-1:1 % Backwards for pre-allocation
result(:, :, indx) = A(indx) .* B;
end
t3=t3+toc;
end
isequal(C,D,result)
[t1 t2 t3]
%{
ans =
1
ans =
0.0128 0.0069 0.0098
%}
  5 commentaires
Lars Kluken
Lars Kluken le 9 Mar 2012
I was also wondering if there is something similar for multiplicating a 2d matrix with slices 3d matrix?
Sean de Wolski
Sean de Wolski le 9 Mar 2012
for matrix multiplication, use a for-loop or James Tursa's mtimex on the FEX.
for element by element:
bsxfun(@times,magic(3),rand(3,3,10));

Connectez-vous pour commenter.

Plus de réponses (3)

James Tursa
James Tursa le 8 Mar 2012
Yet another method for completeness using an outer product formulation. May not be any faster than bsxfun et al:
result = reshape(B(:)*A(:).',[size(B) numel(A)]);
(This tip actually comes from Bruno via another thread)
  2 commentaires
Sean de Wolski
Sean de Wolski le 8 Mar 2012
Nice
Lars Kluken
Lars Kluken le 9 Mar 2012
This is also a good solution. Sometimes a little faster than the bsxfun, and sometimes a little slower. It seems to depend on the sizes of the matrix and the vector.

Connectez-vous pour commenter.


Friedrich
Friedrich le 8 Mar 2012
Hi,
try kron and reshape:
B = [1 2; 3 4]
A = 1:5
reshape(kron(A,B),[size(B),numel(A)])
  6 commentaires
Jan
Jan le 8 Mar 2012
I feel so blind without a Matlab installation. Is MESHGRID free of FOR loops now? I've read all the basic function in Matlab 4, 5.3, 6.5, 2008b, 2009a. Now I'm starting to get confused when I read them in 2011b again. It would be so nice to have a list of changes for each function...
Sean de Wolski
Sean de Wolski le 8 Mar 2012
Looking in meshgrid in 2012a it is just a series of reshapes and ones() used for indexing.

Connectez-vous pour commenter.


Jan
Jan le 8 Mar 2012
Did you pre-allocate the output?
result = zeros([size(B), length(A)]);
for indx = 1:length(A)
result(:, :, indx) = A(indx) .* B;
end
Or:
for indx = length(A):-1:1 % Backwards for pre-allocation
result(:, :, indx) = A(indx) .* B;
end
  1 commentaire
Lars Kluken
Lars Kluken le 8 Mar 2012
Yes I did. In my case the for-loop is fast enough. I was just hoping for a neater solution. I never thought of backwards for-loops for pre-allocation.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by