我正在处理两个方形邻接矩阵。一个比另一个小,但是较小的是较大的子集。
我不确定这是否是交叉生产,矩阵乘法或其他的工作。我是否只需要做一个较大矩阵的子集,然后再相乘?
有一种简单的方法可以说:“嘿,在小表中看到这些列/行名称,然后在大表中乘以它们对应的列/名称?”
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)
您必须使用较小矩阵的行和列名称对较大矩阵进行子集化。类似于以下内容。
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)
如果这些变化large和small将要进行多次,定义函数:
f <- function(m) (m + 3)^2
g <- function(m) log(m + 1)
mult(f(m1), g(m2))
Run Code Online (Sandbox Code Playgroud)
结果与上面相同。
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |