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

Matrix Mult. Question

9 views
Skip to first unread message

Demetrios Tsaparas

unread,
Nov 28, 2005, 11:51:32 AM11/28/05
to
I have a vector:

P = [1 2 3]

And a matrix

Q = [ 1 2 3
3 4 5
6 7 8]

I want to multiply each element of Q by the corresponding column
element of P

For example, from above I would get

Q1 = [1 2 3
6 8 10
18 21 24]

The only catch is I was hoping not to use a loop or create a larger
matrix using repmat(p,1,3)

Thanks for your help,
D

mut ante

unread,
Nov 28, 2005, 12:09:38 PM11/28/05
to
Q.* P(ones(3,1),:)'

Demetrios Tsaparas

unread,
Nov 28, 2005, 12:26:07 PM11/28/05
to
mut ante wrote:
>
>
> Q.* P(ones(3,1),:)'
Thank you very much.
Is there anyway of doing this without creating increasing the size of
P?

Thanks again for your help
D

mut ante

unread,
Nov 28, 2005, 1:02:38 PM11/28/05
to
hi:

i think that you wont be able to do it with a matrix multiplication
because if the first matrix has size [nxm] and the second [oxp] the
result will be [nxp].... and for matrix multiplication to exist you
also need m=o.... so if you want the result matrix to have [3x3] you
will need n = 3 and p=3.... the fact m = o will force you to
increase p length...

using element by element matrix multiplication you will also need to
make both sizes of multiplying matrices equal to the size of the
result matrix....

if anyone has a more creative way of doing what is proposed i would
be glad to know about it....

see you

Randy Poe

unread,
Nov 28, 2005, 1:02:22 PM11/28/05
to

Demetrios Tsaparas wrote:
> mut ante wrote:
> >
> >
> > Q.* P(ones(3,1),:)'
> Thank you very much.
> Is there anyway of doing this without creating increasing the size of
> P?

This isn't increasing the size of P. P is unchanged after
this operation.

- Randy

Demetri T

unread,
Nov 28, 2005, 1:38:06 PM11/28/05
to
You are correct it doesn't change the final size of P.
However, I was wondering how P is 'manipulated' in order to perform
the matrix mult. The program I am trying to write will have very
large matrix dimensions, as a result, if p is temporarily enlarged
from [1xM] to [NxM]’ the program might slow down a great deal.
Specifically, I was wondering how efficient this would be. I am
trying to find the fastest way to perform this operation.

Thanks for your help,
Demetri

Randy Poe

unread,
Nov 28, 2005, 1:58:31 PM11/28/05
to

Demetri T wrote:
> You are correct it doesn't change the final size of P.
> However, I was wondering how P is 'manipulated' in order to perform
> the matrix mult. The program I am trying to write will have very
> large matrix dimensions, as a result, if p is temporarily enlarged
> from [1xM] to [NxM]' the program might slow down a great deal.

You're correct that a temporary large matrix is created. If N and
M are very large, you could run into a memory-full error and
the command wouldn't execute. In that case you'd need another
approach, like doing it a column at a time. But if memory is
sufficient to create the temporary matrix, the operation should
be fast. Matlab is pretty well optimized.

> Specifically, I was wondering how efficient this would be. I am
> trying to find the fastest way to perform this operation.

If there is sufficient PHYSICAL memory, using built-in matrix
operations
is fastest. If virtual memory and disk swaps are required, that will
slow things down.

- Randy

StephenLL

unread,
Nov 28, 2005, 2:17:10 PM11/28/05
to

Having gone through this before and not knowing how big the matrices
are going to be: I would suggest writing a mex function. I usually
have to element wise muliply each row of a matrix by a row vector or
each column by a column vector.

It was happening enough and the size of the matrices varied from very
small to very large (where the usually repmat, etc tricks took too
much memory) that I was forced to write a generic mex function to
handle these situations.

These are the times where I wish Matlab worked similar to R
(www.r-project.org). R knows to automatically "reuse" the row vector
each time.

If I had to pick two features to bring from R to Matlab it would be
the data "reuse" feature and how R allows for arguements such as
myfunc(data = adefault, paramb = default2) so when you call the
function you can either: pass variables in any order and two omit
variables since the defaults are right their in the declaration.

Stephen

us

unread,
Nov 28, 2005, 2:37:43 PM11/28/05
to
Demetri T:
<SNIP gen mat-vec op evergreen...

1) have a look at <doug schwarz>'s toolbox available here
<http://www.frontiernet.net/~dmschwarz/genops.html>

2) another one of the many solutions

function a=foo(a,op,b)
% note: input check is removed for sake of brevity
sop='+-*/';
mop={@plus,@minus,@times,@rdivide};
op=mop{sop==op};
for i=1:size(a,2)
a(:,i)=op(a(:,i),b);
end

us

John D'Errico

unread,
Nov 28, 2005, 6:59:13 PM11/28/05
to
In article <ef1cd...@webx.raydaftYaTP>,
"Demetrios Tsaparas" <spartan...@hotmail.com> wrote:

The best way to do this without a loop and without
some variant of repmat or a mex function is with a
sparse diagonal matrix multiply.

P = [1 2 3]

Q = [ 1 2 3
3 4 5
6 7 8]

n = length(P);
Q1 = spdiags(P',0,n,n)*Q

Q1 =
1 2 3
6 8 10
18 21 24

This should be efficient both in time and memory,
although it would probably not be as efficient as a
mex function. It should be quite reasonable though.

HTH,
John D'Errico

--
The best material model of a cat is another, or preferably the same, cat.
A. Rosenblueth, Philosophy of Science, 1945

Those who can't laugh at themselves leave the job to others.
Anonymous

0 new messages