Pointwise multiplication of matrix with vector

1712 views

Marius

Jan 27, 2006, 8:58:15 AM1/27/06
to
Hello,

In Matlab one can write
c = 3; % (some scalar)
x = 0:10; % (some vector)
y = c * x; % (multiply every component of x with c)

This is much faster than using a for loop and writing
for k = 1:length(x)
y(k) = c * x(k);
end

I would now like to do a similar thing, but where the scalar is
replaced by a n x 1 vector and the vector is replaced by a n x m
matrix. I.e., I would like to multiply each column of a matrix
pointwise with a column vector.

So far I can see two solutions for this (besides a double for loop):

1. Use repmat to create m copies of the colum vector and multiply the
resulting matrix pointwise with the original matrix:

% Given a vector v (n x 1) and matrix A (n x m):
V = repmat(v, 1, m);
B = A .* V;

2. Use a for loop to go through each element of the vector and thus
reduce to the problem to the <scalar> * <vector>
situation:

for k = 1:length(v)
B(1, :) = A(1, :) * v(k);
end

I have found the second solution to be faster than the first one. Is
there a better solution?

Thanks
Marius

Doug Schwarz

Jan 27, 2006, 9:02:28 AM1/27/06
to
In article <ef26e...@webx.raydaftYaTP>,
Marius <noemai...@hotmail.com> wrote:

You might find this to be interesting.

I don't know if it's faster, but it works without replicating data.

--
Doug Schwarz
Make obvious changes to get real email address.

French Caroline

Jan 27, 2006, 9:15:37 AM1/27/06
to
3rd solution :
B = diag(v)*A
Caroline

Michael Wild

Jan 27, 2006, 9:10:33 AM1/27/06
to

http://www.frontiernet.net/~dmschwarz/genops.html provides generalized
operators.

michael

kle...@gmail.com

Jan 28, 2006, 4:12:42 AM1/28/06
to
Thanks, exactly what I was looking for.
However, in order to compile it on Matlab 7.1 (R14) on Mac OS X, I had
to make the following changes:

- In makegenops.m, change the filename on l.31 from 'genops_noflops.c'
to 'genops.c'
- In genops.c, change the following lines, wherever they occur:
zMat = mxCreateNumericArray(ndim, s, mxDOUBLE_CLASS, mxREAL);
mxSetLogical(zMat);
to this:
zMat = mxCreateLogicalArray(ndim, s);

This seems to make it work fine. (mxSetLogical has been obsolete since
Matlab 6.5).
(Doug please comment if you think that will break the functionality)

Best
Marius

Doug Schwarz

Jan 30, 2006, 12:44:27 AM1/30/06
to
kle...@gmail.com wrote:

Marius,

That looks right and thanks for pointing these things out.

I originally wrote this back when MATLAB counted flops so I had my
functions update the flop counter. I updated the code by removing the
flop counting stuff when MATLAB eliminated it and called that version
genops_noflops.c. Eventually, I deleted the flops version, but it seems
that I didn't change makegenops.

Obviously, the second change is also due to the age of this code.

I'm glad to hear that it works for you.

Daniel

Jul 27, 2014, 7:24:09 PM7/27/14
to
Excellent.
Somebody knows the same for matrix multiplication? mtimes?
Thanks!

James Tursa

Jul 28, 2014, 11:36:17 AM7/28/14
to
"Daniel" wrote in message <lr41mp\$bks\$1...@newscl01ah.mathworks.com>...
> Excellent.
> Somebody knows the same for matrix multiplication? mtimes?
> Thanks!

If you mean nD matrix multiplication using 2D planes of the nD matrices, then there are submissions on the FEX that do this. E.g.

http://www.mathworks.com/matlabcentral/fileexchange/25977-mtimesx-fast-matrix-multiply-with-multi-dimensional-support