5
votes

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

4 Answers

6
votes

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"
)))
4
votes

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"
)))
2
votes

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
1
votes

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