我有两个矩阵。
Matrix 1
id1 id2 id3 id4 id5
row1 0.4 0.5 0.2 0.1 0.3
Matrix 2
id1 id2 id3 id4 id5
row1 1.1 1.2 1.3 4.1 4.0
row2 3.4 2.6 1.2 3.2 2.1
row3 4.5 6.2 1.1 1.3 3.1
我试图通过id匹配列向量,并为矩阵1和2中的每个列运行以下公式,与剩余的列ID无关
(matrix1$id*matrix2$id)^2+2(matrix1$id*matrix2$id)+(1-matrix1$id)^2
请根据列ID建议在匹配后循环使用此函数的方法。
答案 0 :(得分:4)
mat1 <- matrix(nrow=1,ncol=5)
mat1 <- as.matrix(t(c(0.4, 0.5, 0.2, 0.1, 0.3)))
mat2 <- matrix(nrow=3, ncol=5)
mat2[1,] <- c(1.1, 1.2, 1.3, 4.1, 4.0)
mat2[2,] <- c(3.4, 2.6, 1.2, 3.2, 2.1)
mat2[3,] <- c(4.5, 6.2, 1.1, 1.3, 3.1)
result <- matrix(nrow = 3, ncol = 5)
for(i in 1:ncol(mat1)){
result[,i] <- t((mat1[,i]*mat2[,i])^2 + 2*(mat1[,i]*mat2[,i]) + (1 - mat1[,i])^2)
}
result
[,1] [,2] [,3] [,4] [,5]
[1,] 1.4336 1.81 1.2276 1.7981 4.3300
[2,] 4.9296 4.54 1.1776 1.5524 2.1469
[3,] 7.2000 16.06 1.1284 1.0869 3.2149
您还可以使用列名而不是索引,或将for
循环中的等式发送到函数并使用apply
。
答案 1 :(得分:1)
使用t()
和完全向量化的算术(假设列对应):
x <- t(m2)*c(m1); t(x^2+2*x+(1-c(m1))^2);
## id1 id2 id3 id4 id5
## row1 1.4336 1.81 1.2276 1.7981 4.3300
## row2 4.9296 4.54 1.1776 1.5524 2.1469
## row3 7.2000 16.06 1.1284 1.0869 3.2149
在列名上使用sapply()
:
sapply(colnames(m1),function(cn) { x <- m1[,cn]*m2[,cn]; x^2+2*x+(1-m1[,cn])^2; });
## id1 id2 id3 id4 id5
## row1 1.4336 1.81 1.2276 1.7981 4.3300
## row2 4.9296 4.54 1.1776 1.5524 2.1469
## row3 7.2000 16.06 1.1284 1.0869 3.2149
数据强>
m1 <- as.matrix(data.frame(id1=0.4,id2=0.5,id3=0.2,id4=0.1,id5=0.3,row.names='row1'));
m2 <- as.matrix(data.frame(id1=c(1.1,3.4,4.5),id2=c(1.2,2.6,6.2),id3=c(1.3,1.2,1.1),id4=c(4.1,3.2,1.3),id5=c(4,2.1,3.1),row.names=c('row1','row2','row3')));