使用来自两个独立矩阵的变量执行计算

时间:2016-06-06 23:26:22

标签: r matrix

我有两个矩阵。

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建议在匹配后循环使用此函数的方法。

2 个答案:

答案 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')));