Matrix element-by-element multiplication
Hi,
R may not have a special "scalar", but it is common, if informal, in
linear algebra to refer to a 1 x 1 matrix as a scalar. Indeed,
something like:
1:10 * matrix(2)
or
matrix(2) * 1:10
are both valid. Even
matrix(2) %*% 1:10
and
1:10 %*% matrix(2)
work, where the vector seems to be silently coerced to a matrix. R
even seems to work hard to convert to a conformable matrix:
## works:
1:10 %*% matrix(1:10)
## does not work
matrix(1:10) %*% matrix(1:10)
## works
t(matrix(1:10)) %*% matrix(1:10)
Interestingly, there is actually a (rather old) comment in arithmetic.c
/* If either x or y is a matrix with length 1 and the other is a
vector, we want to coerce the matrix to be a vector.
Do we want to? We don't do it! BDR 2004-03-06
*/
Given the coersion that already occurs with vectors to matrices for
%*% and matrices to vectors for *, it seems not unreasonable to
convert a 1 x 1 matrix to a vector _for_ * so that the following
yields identical results:
matrix(1:9, 3) * matrix(2)
matrix(1:9, 3) * 2
Of course in the mean time, or in general, it is a good habit to
create or explicity coerce objects yourself rather than relying on R
to make smart guesses about what should be happening.
Cheers,
Josh
On Sun, Nov 6, 2011 at 4:02 PM, R. Michael Weylandt
<michael.weylandt at gmail.com> <michael.weylandt at gmail.com> wrote:
It looks like pdf is not a "scalar" (that term actually has no meaning in R but I know what you mean) but is rather a 1x1 matrix, as attested by the fact it has dimensions. If you give dnorm() a matrix it will return one, as it did here. Perhaps you should look at the is.matrix() and as.vector() functions rather than abusing a side-effect of c(), which makes it much more difficult to see R's internal logic, which, while quirky, is useful at the end of the day. Michael PS - It's good form to cc the list at each step so others can follow along and contribute when I say something wrong. It also helps you get quicker answers. On Nov 6, 2011, at 1:06 AM, Steven Yen <syen at utk.edu> wrote:
I am trying to multiply what I know is a scalar (pdf(xb)) to a column vector of coefficient (bb). In the following, pdf is a scalar and bb is 5 x 1. I first show what worked and then what did not work. If my pdf is a scalar, why would I need c(pdf) to be able to pre-multiply it by a 5 x 1 vector? ---
x ? ? ?<- as.matrix(colMeans(x)) xb ? ? <- t(x)%*%bb pdf ? ?<- dnorm(xb)
dim(bb)
[1] 5 1
cpdf ?<- c(pdf) dim(cpdf)
NULL
cpdf
[1] 0.304201
(dphat <- cpdf*bb)
? ? ? ? ? ? ? ? ? ?[,1] (Intercept) ?0.32744753 xrage ? ? ? -0.00599225 xryr ? ? ? ? 0.01758431 xrrate ? ? ?-0.08217250 xrrel ? ? ? -0.05695434
pdf ? ?<- dnorm(xb) dim(pdf)
[1] 1 1
? ? ? ? ?[,1] [1,] 0.304201
(dphat <- ?pdf*bb)
Error in pdf * bb : non-conformable arrays
At 12:21 AM 11/6/2011, you wrote:
There are a few (nasty?) side-effects to c(), one of which is stripping a matrix of its dimensionality. E.g., x <- matrix(1:4, 2) c(x) [1] 1 2 3 4 So that's probably what happened to you. R has a somewhat odd feature of not really considering a pure vector as a column or row vector but being willing to change it to either: e.g. y <- 1:2 x %*% y y %*% x y %*% y while matrix(y) %*% x throws an error, which can also trip folks up. You might also note that x * y and y*x return the same thing in this problem. Getting back to your problem: what are v and b and what are you hoping to get done? Specifically, what happened when you tried v*b (give the exact error message). It seems likely that they are non-conformable matrices, but here non-conformable for element-wise multiplication doesn't mean the same thing as it does for matrix multiplication. E.g., x <- matrix(1:4,2) y <- matrix(1:6,2) dim(x) [1] 2 2 dim(y) [1] 2 3 x * y -- here R seems to want matrices with identical dimensions, but i can't promise that. x %*% y does work. Hope this helps and yes I know it can seem crazy at first, but there really is reason behind it at the end of the tunnel, Michael On Sun, Nov 6, 2011 at 12:11 AM, Steven Yen <syen at utk.edu> wrote:
My earlier attempt ? ?dp <- v*b did not work. Then, ? ?dp <- c(v)*b worked. Confused, Steven At 09:10 PM 11/4/2011, you wrote: Did you even try? a <- 1:3 x <- ?matrix(c(1,2,3,2,4,6,3,6,9),3) a*x ? ? ?[,1] [,2] [,3] [1,] ? ?1 ? ?2 ? ?3 [2,] ? ?4 ? ?8 ? 12 [3,] ? ?9 ? 18 ? 27 Michael On Fri, Nov 4, 2011 at 7:26 PM, Steven Yen <syen at utk.edu> wrote:
is there a way to do element-by-element multiplication as in Gauss and MATLAB, as shown below? Thanks. --- a ? ? ? ?1.0000000 ? ? ? ?2.0000000 ? ? ? ?3.0000000 x ? ? ? ?1.0000000 ? ? ? ?2.0000000 ? ? ? ?3.0000000 ? ? ? ?2.0000000 ? ? ? ?4.0000000 ? ? ? ?6.0000000 ? ? ? ?3.0000000 ? ? ? ?6.0000000 ? ? ? ?9.0000000 a.*x ? ? ? ?1.0000000 ? ? ? ?2.0000000 ? ? ? ?3.0000000 ? ? ? ?4.0000000 ? ? ? ?8.0000000 ? ? ? ?12.000000 ? ? ? ?9.0000000 ? ? ? ?18.000000 ? ? ? ?27.000000 -- Steven T. Yen, Professor of Agricultural Economics The University of Tennessee http://web.utk.edu/~syen/ ? ? ? ?[[alternative HTML version deleted]]
______________________________________________ R-help at r-project.org mailing list 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.
-- Steven T. Yen, Professor of Agricultural Economics The University of Tennessee http://web.utk.edu/~syen/
-- Steven T. Yen, Professor of Agricultural Economics The University of Tennessee http://web.utk.edu/~syen/
? ? ? ?[[alternative HTML version deleted]]
______________________________________________ R-help at r-project.org mailing list 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.
Joshua Wiley Ph.D. Student, Health Psychology Programmer Analyst II, ATS Statistical Consulting Group University of California, Los Angeles https://joshuawiley.com/