【问题标题】:Perform calculations using variables from two independent matrices使用来自两个独立矩阵的变量执行计算
【发布时间】:2016-06-06 23:26:22
【问题描述】:

我有两个矩阵。

矩阵 1

     id1 id2 id3 id4 id5
row1 0.4 0.5 0.2 0.1 0.3

矩阵 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 匹配列向量,并独立于剩余的列 id 为矩阵 1 和 2 中的每一列运行以下公式

(matrix1$id*matrix2$id)^2+2(matrix1$id*matrix2$id)+(1-matrix1$id)^2

请提出一种在基于列 ID 匹配后跨 ID 循环该函数的方法。

【问题讨论】:

    标签: r matrix


    【解决方案1】:
    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

    【讨论】:

      【解决方案2】:

      使用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')));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 2013-12-20
        相关资源
        最近更新 更多