Я работаю с двумя квадратными матрицами смежности. Один меньше другого, но меньший является подмножеством большего.
Я не уверен, что это работа для кросспродажа, умножения матриц или чего-то еще. Нужно ли мне просто сделать подмножество большей матрицы, а затем умножить ее позже?
Есть ли более простой способ просто сказать: «Эй, посмотрите эти имена столбцов / строк в маленькой таблице, умножьте их соответствующие имена столбцов / строк в большой таблице?»
m1<-matrix(1,5,5)
colnames(m1)<-LETTERS[1:5]
rownames(m1)<-LETTERS[1:5]
m1
# A B C D E
# A 1 1 1 1 1
# B 1 1 1 1 1
# C 1 1 1 1 1
# D 1 1 1 1 1
# E 1 1 1 1 1
m2<-matrix(1:9,3,3)
colnames(m2)<-c("D","A","C")
rownames(m2)<-c("D","A","C")
m2
# D A C
# D 1 4 7
# A 4 5 8
# C 7 8 9
hoping to get something that looks like
if I multiply m1 * m2:
# A B C D E
# A 5 1 8 4 1 -> reflects multiplication from matching adjacency in smaller table
# B 1 1 1 1 1 -> stays the same
# C 8 1 9 7 1 -> reflects multiplication from matching adjacency in smaller table
# D 4 1 7 1 1 -> reflects multiplication from matching adjacency in smaller table
# E 1 1 1 1 1 -> stays the same





Вы должны разбить большую матрицу на подмножество, используя имена строк и столбцов меньшей матрицы. Примерно так.
mult <- function(large, small){
rn <- rownames(small)
cn <- colnames(small)
large[rn, cn] <- large[rn, cn]*small
large
}
mult(m1, m2)
# A B C D E
#A 5 1 8 2 1
#B 1 1 1 1 1
#C 6 1 9 3 1
#D 4 1 7 1 1
#E 1 1 1 1 1
Если вам нужны более сложные умножения, такие как (large + 3)^2 * log(small+1), пока размеры и имена строк / столбцов остаются совместимыми, просто передайте эти матрицы в mult.
mult((m1 + 3)^2, log(m2 + 1))
# A B C D E
#A 28.66815 16 35.15559 17.57780 16
#B 16.00000 16 16.00000 16.00000 16
#C 31.13456 16 36.84136 22.18071 16
#D 25.75101 16 33.27106 11.09035 16
#E 16.00000 16 16.00000 16.00000 16
Если эти преобразования large и small необходимо выполнить несколько раз, определите функции:
f <- function(m) (m + 3)^2
g <- function(m) log(m + 1)
mult(f(m1), g(m2))
Результат такой же, как и выше.
Большое спасибо, Руи! Казалось, это сработало. Есть идеи, как заставить эту функцию работать, если это немного более сложное умножение? Например: (большой + 3) ^ 2 * журнал (маленький + 1)
Инструкция, которая создает
m2, не создает разнесенную матрицу.