Умножьте две матрицы с разными размерами в R

#r #matrix #apply #sapply

#r #матрица #применить #sapply

Вопрос:

Я пытаюсь использовать apply для умножения двух матриц с разными размерами. Матрицы являются:

 xx <- matrix(c(1, 2, 3, 4, 5, 6), nrow=2, ncol=3, byrow=T)
yy <- matrix(c(10, 100), nrow=2, ncol=1, byrow=T)
  

Я хочу умножить каждую строку одной матрицы на каждую строку другой матрицы и получить это:

 > zz
      [,1]  [,2]  [,3]
[1,]    10    20    30
[2,]   400   500   600
  

Я попробовал sapply(yy, function(x) xx*x) , который выдает матрицу 6×2 вместо матрицы 3×2, которую я хочу. Также apply(yy, 2, function(x) xx*x) , который создает матрицу 6×1, не работает.
В аналогичной ситуации в прошлом я использовал sapply без проблем, поэтому я не понимаю, почему это не работает сейчас (у меня всегда были небольшие проблемы с обдумыванием *apply ). Что я делаю не так?

Ответ №1:

Преобразуйте yy в вектор с помощью c() , и при умножении он будет преобразован в размерность xx .

 xx * c(yy)

#      [,1] [,2] [,3]
# [1,]   10   20   30
# [2,]  400  500  600
  

Или путем умножения матрицы :

 diag(c(yy)) %*% xx
  

Комментарии:

1. Это решение, которое лучше всего подходит для моего случая, но другие предложения тоже работают. Спасибо!

Ответ №2:

Вы можете использовать sweep :

 sweep(xx, 1, yy, `*`)

#     [,1] [,2] [,3]
#[1,]   10   20   30
#[2,]  400  500  600
  

Или сделайте размеры yy такими же, как xx и непосредственно умножьте :

 xx * yy[row(xx),]
  

Ответ №3:

используйте apply

 apply(xx, 2, function(x) x * yy)

     [,1] [,2] [,3]
[1,]   10   20   30
[2,]  400  500  600
  

Ответ №4:

Мы также можем сделать

 xx * yy[,1]
#    [,1] [,2] [,3]
#[1,]   10   20   30
#[2,]  400  500  600