Более общий или эффективный подход для этого умножения матриц? - PullRequest
0 голосов
/ 05 февраля 2019

В R, есть ли более эффективный и / или общий способ получения желаемого результата из двух матриц ниже?Я подозреваю, что то, что я сделал, - это просто операция умножения эзотерических матриц, о которой я не знаю.

ff <- matrix(1:6,ncol=2)
# [,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    6

bb <- matrix(7:10,ncol=2)
# [,1] [,2]
# [1,]    7    9
# [2,]    8   10

# DESIRE:
#  7 36
# 14 45
# 21 54
#  8 40
# 16 50
# 24 60

Это работает, но не является общим решением, которое я ищу:

rr1 <- t(t(ff) * bb[1,])
rr2 <- t(t(ff) * bb[2,])
rbind(rr1,rr2)
# [,1] [,2]
# [1,]    7   36
# [2,]   14   45
# [3,]   21   54
# [4,]    8   40
# [5,]   16   50
# [6,]   24   60

Этот следующий блок кода кажется довольно эффективным и общим.Но есть ли лучший способ?Что-то вроде kronecker(ffa,bba)?(что явно не работает в этом случае)

ffa <- matrix(rep(t(ff),2), ncol=2, byrow=T)
bba <- matrix(rep(bb,each=3), ncol=2)
ffa * bba
# [,1] [,2]
# [1,]    7   36
# [2,]   14   45
# [3,]   21   54
# [4,]    8   40
# [5,]   16   50
# [6,]   24   60

Это связано с другими моими вопросами:

  1. Использование функции apply над полем строкис ожиданием суммированных результатов , где я пытаюсь понять поведение самого apply и:

  2. Это пример какого-то более общего матричного продукта? , где я спрашиваю про теоретическую математику, в частности.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Функция, которую вы ищете, доступна в пакете Matrix как функция KhatriRao.Поскольку функция находится в матрице, выходной файл представляет собой матрицу класса "dgCMatrix" (разреженная матрица).Вы можете преобразовать его в обычную матрицу класса "matrix" с помощью as.matrix.

library(Matrix)
as.matrix(KhatriRao(bb, ff))
0 голосов
/ 05 февраля 2019

Используйте продукт kronecker и выделите соответствующие столбцы:

kronecker(bb, ff)[, c(diag(ncol(bb))) == 1]

или используйте инфиксный оператор для kronecker:

(bb %x% ff)[, c(diag(ncol(bb))) == 1]

Другой подход заключается в преобразовании аргументов во фреймы данных.и mapply kronecker через них.Для рассматриваемого случая выполняется вычисление cbind(bb[, 1] %x% ff[, 1], bb[, 2] %x% ff[, 2]), но в более общем виде, без обращения к индексам:

mapply(kronecker, as.data.frame(bb), as.data.frame(ff))

или с использованием оператора инфикса для kronecker:

mapply(`%x%`, as.data.frame(bb), as.data.frame(ff))
...