г веса матрицы - PullRequest
       20

г веса матрицы

1 голос
/ 17 апреля 2020

У меня есть матрица nx5. Первые 6 строк:

  x1    x2   x3  x4  x5
   1    30    3  43   0
   3    40    2  35   0
   3    50    7  72   0
   4    40   58  63  10
   1    20   19  61  10
   4    20    5  49   0

Также у меня есть столбец матрицы nx1, который представляет веса.

 w
 1.080042
 1.083287
 1.141108
 1.191246
 1.117395
 1.081123

Моя цель - взвесить исходную матрицу nx5 этими весами. Я попытался a%*%w, но это привело к матрице 5x1. Это не то, что я хочу. У меня вопрос, как мне создать взвешенную матрицу nx5? Спасибо.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Если вы просто умножаете каждый столбец на вектор, тогда просто

mt * vc

Где mt - это (имя) вашей матрицы, а vc - (имя) вашего вектора, например, взяв

mt <- (diag(5)+0.1)
vc <- c(1:5)
mt * vc

Дает

     [,1] [,2] [,3] [,4] [,5]
[1,]  1.1  0.1  0.1  0.1  0.1
[2,]  0.2  2.2  0.2  0.2  0.2
[3,]  0.3  0.3  3.3  0.3  0.3
[4,]  0.4  0.4  0.4  4.4  0.4
[5,]  0.5  0.5  0.5  0.5  5.5

Если ваши веса находятся в матрице из одного столбца, то сначала преобразуйте в вектор с as.vector()

0 голосов
/ 17 апреля 2020

Если мы хотим умножить значения первых строк набора данных на соответствующие значения второго набора данных

df1 * df2[row(df1)]

Или на matrix es

m1 * m2[row(m1)]

или используя sweep

sweep(df1, 1, df2$w, `*`)
sweep(m1, 1, m2[,1], `*`)

data

df1 <- structure(list(x1 = c(1L, 3L, 3L, 4L, 1L, 4L), x2 = c(30L, 40L, 
50L, 40L, 20L, 20L), x3 = c(3L, 2L, 7L, 58L, 19L, 5L), x4 = c(43L, 
35L, 72L, 63L, 61L, 49L), x5 = c(0L, 0L, 0L, 10L, 10L, 0L)), 
class = "data.frame", row.names = c(NA, 
-6L))

df2 <- structure(list(w = c(1.080042, 1.083287, 1.141108, 1.191246, 
1.117395, 1.081123)), class = "data.frame", row.names = c(NA, 
-6L))

m1 <- as.matrix(df1)
m2 <- as.matrix(df2)
...