Multiply Matrix R

Viewed 87

How would I multiply :

                    BNP.PA.Adjusted ACA.PA.Adjusted UG.PA.Adjusted
BNP.PA.Adjusted     0.010129967     0.009577789    0.007148473
ACA.PA.Adjusted     0.009577789     0.012127668    0.007340544
UG.PA.Adjusted      0.007148473     0.007340544    0.015503678

by :

c(0.3 , 0.2 , 0.5)

In order to get :

                    BNP.PA.Adjusted       ACA.PA.Adjusted       UG.PA.Adjusted
BNP.PA.Adjusted     0.010129967x0.3x0.3   0.009577789x0.2x0.3   0.007148473x0.5x0.3
ACA.PA.Adjusted     0.009577789x0.3x0.2   0.012127668x0.2x0.2   0.007340544x0.5x0.2
UG.PA.Adjusted      0.007148473x0.3x0.5   0.007340544x0.2x0.5   0.015503678x0.5x0.5

I tried using %*% : MaMatrix <- cov_m %*% Poids but this only does

                    BNP.PA.Adjusted   ACA.PA.Adjusted   UG.PA.Adjusted
BNP.PA.Adjusted     0.010129967x0.3   0.009577789x0.2   0.007148473x0.5
ACA.PA.Adjusted     0.009577789x0.3   0.012127668x0.2   0.007340544x0.5
UG.PA.Adjusted      0.007148473x0.3   0.007340544x0.2   0.015503678x0.5

What am I Missing ?

4 Answers

An option is outer on the vector and then directly multiply

m1 <- outer(v1, v1)

Or as @user20650 suggested (tcrossprod)

m1 <- tcrossprod(v1)
cov_m * m1

-output

#               BNP.PA.Adjusted ACA.PA.Adjusted UG.PA.Adjusted
#BNP.PA.Adjusted    0.0009116970    0.0005746673   0.0010722709
#ACA.PA.Adjusted    0.0005746673    0.0004851067   0.0007340544
#UG.PA.Adjusted     0.0010722709    0.0007340544   0.0038759195

data

v1 <- c(0.3, 0.2, 0.5)

cov_m <- structure(c(0.010129967, 0.009577789, 0.007148473, 0.009577789, 
0.012127668, 0.007340544, 0.007148473, 0.007340544, 0.015503678
), .Dim = c(3L, 3L), .Dimnames = list(c("BNP.PA.Adjusted", "ACA.PA.Adjusted", 
"UG.PA.Adjusted"), c("BNP.PA.Adjusted", "ACA.PA.Adjusted", "UG.PA.Adjusted"
)))

You can try the code below

> diag(x) %*% cov_m %*% diag(x)
             [,1]         [,2]         [,3]
[1,] 0.0009116970 0.0005746673 0.0010722709
[2,] 0.0005746673 0.0004851067 0.0007340544
[3,] 0.0010722709 0.0007340544 0.0038759195

Data

> dput(x)
c(0.3, 0.2, 0.5)

> dput(cov_m)
structure(c(0.010129967, 0.009577789, 0.007148473, 0.009577789, 
0.012127668, 0.007340544, 0.007148473, 0.007340544, 0.015503678
), .Dim = c(3L, 3L), .Dimnames = list(c("BNP.PA.Adjusted", "ACA.PA.Adjusted",
"UG.PA.Adjusted"), c("BNP.PA.Adjusted", "ACA.PA.Adjusted", "UG.PA.Adjusted"
)))

You can also use sweep():

sweep(mat, 2, FUN = `*`, vec) * vec

                BNP.PA.Adjusted ACA.PA.Adjusted UG.PA.Adjusted
BNP.PA.Adjusted    0.0009116970    0.0005746673   0.0010722709
ACA.PA.Adjusted    0.0005746673    0.0004851067   0.0007340544
UG.PA.Adjusted     0.0010722709    0.0007340544   0.0038759195

You can simply multiply the transpose of the matrix by the vector and transpose back again: e.g.:

m <- matrix(1:9, ncol = 3)
m
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
x <- c(2, 4, 6)
m <- t(t(m) * x) # all you need
m
     [,1] [,2] [,3]
[1,]    2   16   42
[2,]    4   20   48
[3,]    6   24   54
Related