#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