Multiply each element of a vector with a matrix

24 visualizaciones (últimos 30 días)
Lars Kluken
Lars Kluken el 8 de Mzo. de 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?

Respuesta aceptada

Sean de Wolski
Sean de Wolski el 8 de Mzo. de 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 comentarios
Lars Kluken
Lars Kluken el 9 de Mzo. de 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 el 9 de Mzo. de 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));

Iniciar sesión para comentar.

Más respuestas (3)

James Tursa
James Tursa el 8 de Mzo. de 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 comentarios
Sean de Wolski
Sean de Wolski el 8 de Mzo. de 2012
Nice
Lars Kluken
Lars Kluken el 9 de Mzo. de 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.

Iniciar sesión para comentar.


Friedrich
Friedrich el 8 de Mzo. de 2012
Hi,
try kron and reshape:
B = [1 2; 3 4]
A = 1:5
reshape(kron(A,B),[size(B),numel(A)])
  6 comentarios
Jan
Jan el 8 de Mzo. de 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 el 8 de Mzo. de 2012
Looking in meshgrid in 2012a it is just a series of reshapes and ones() used for indexing.

Iniciar sesión para comentar.


Jan
Jan el 8 de Mzo. de 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 comentario
Lars Kluken
Lars Kluken el 8 de Mzo. de 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.

Iniciar sesión para comentar.

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by