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);
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>
for k = 1:length(v)
B(1, :) = A(1, :) * v(k);
I have found the second solution to be faster than the first one. Is
there a better solution?
You might find this to be interesting.
I don't know if it's faster, but it works without replicating data.
Make obvious changes to get real email address.
http://www.frontiernet.net/~dmschwarz/genops.html provides generalized
- In makegenops.m, change the filename on l.31 from 'genops_noflops.c'
- In genops.c, change the following lines, wherever they occur:
zMat = mxCreateNumericArray(ndim, s, mxDOUBLE_CLASS, mxREAL);
zMat = mxCreateLogicalArray(ndim, s);
This seems to make it work fine. (mxSetLogical has been obsolete since
(Doug please comment if you think that will break the functionality)
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.