[prev in list] [next in list] [prev in thread] [next in thread] 

List:       r-help
Subject:    Re: [R] Matrix element-by-element multiplication
From:       David Winsemius <dwinsemius () comcast ! net>
Date:       2015-09-30 4:25:38
Message-ID: 3B87F9B7-AA7F-4430-BFA4-387EE0F37A40 () comcast ! net
[Download RAW message or body]


On Sep 29, 2015, at 4:49 PM, waddawanna wrote:

> Hello Steven,
> 
> It looks like, there is no in-built function that can do GAUSS ".*"
> element-wise multiplication.
> Now, if you want to make the desired computations in R, it is actually
> preatty straightforward.
> 
> > a<-c(1,2,3)
> > b<-matrix(rep(1:9,1),3,3,byrow=TRUE)
> > a*b
> 
> That, should work fine. But, suppose that for some reason you have following
> situation, which can make you trip for hours of sleepless nights. That is,
> you have a matrix "b", where number of columns equal to number of columns of
> your vector "a". That is
> 
> > b<-matrix(rep(1:9,1),3,3,byrow=TRUE);b
> [,1] [,2] [,3]
> [1,]    1    2    3
> [2,]    4    5    6
> [3,]    7    8    9
> 
> > a <- matrix(rep(1:3,1),1,3,byrow=TRUE)
> [,1] [,2] [,3]
> [1,]    1    2    3
> 
> If you try to do elementwise multilication, i.e., of those two
> > b*a
> 
> You get an error that they are not comfomable,

You should not have gotten that error with either `*` or `%*%`.

> that is why, you have to
> write your own function (here, 
> I just write the for-loop):
> > for ( i in 1:3 ) {
> foo[ ,i] = ( foo[ ,i] * bar[1,i] ) ;
> }
> [,1] [,2] [,3]
> [1,]    1    4    9
> [2,]    4   10   18
> [3,]    7   16   27

You were expecting c(1,2,3) to be a row-vector. That leads to disappointment. If \
anything it will be a column-vector.

Notice .... no error:
> a*b
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    8   10   12
[3,]   21   24   27


You really wanted to sweep that vector

> sweep(b, 1,a,'*')   # Sweeping by rows is same a multiplying by recycle column \
> vector 
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    8   10   12
[3,]   21   24   27

> sweep(b, 2, a, '*')  # You wanted to "sweep" across columns
     [,1] [,2] [,3]
[1,]    1    4    9
[2,]    4   10   18
[3,]    7   16   27

-- 

David Winsemius
Alameda, CA, USA

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic