将两个邻接矩阵逐元素相乘,一个比另一个大

mic*_*ata 1 r matrix

我正在处理两个方形邻接矩阵。一个比另一个小,但是较小的是较大的子集。

我不确定这是否是交叉生产,矩阵乘法或其他的工作。我是否只需要做一个较大矩阵的子集,然后再相乘?

有一种简单的方法可以说:“嘿,在小表中看到这些列/行名称,然后在大表中乘以它们对应的列/名称?”

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
Run Code Online (Sandbox Code Playgroud)

Rui*_*das 5

您必须使用较小矩阵的行和列名称对较大矩阵进行子集化。类似于以下内容。

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
Run Code Online (Sandbox Code Playgroud)

如果您想要更复杂的乘法,例如(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
Run Code Online (Sandbox Code Playgroud)

如果这些变化largesmall将要进行多次,定义函数:

f <- function(m) (m + 3)^2
g <- function(m) log(m + 1)

mult(f(m1), g(m2))
Run Code Online (Sandbox Code Playgroud)

结果与上面相同。