Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

# Pointwise multiplication of matrix with vector

1,712 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