代码之家  ›  专栏  ›  技术社区  ›  user2079550

如何快速执行类似于乘法的矩阵运算?

  •  2
  • user2079550  · 技术社区  · 6 年前

    我有两个矩阵。

    A<-matrix(c(1,0,2,3),2,2)
    B<-matrix(c(0,1,4,2),2,2)
    

    而不是乘法( A%*%B )结果如下:

    C[1,1]<-A[1,1]*B[1,1]+ A[1,2]*B[2,1]
    C[1,2]<-A[1,1]*B[1,2]+ A[1,2]*B[2,2]
    C[2,1]<-A[2,1]*B[1,1]+ A[2,2]*B[2,1]
    C[2,2]<-A[2,1]*B[1,2]+ A[2,2]*B[2,2]
    

    如何获得乘法的修改版本并得到如下结果:

    C[1,1]<-min(A[1,1],B[1,1])+ min(A[1,2],B[2,1])
    C[1,2]<-min(A[1,1],B[1,2])+ min(A[1,2],B[2,2])
    C[2,1]<-min(A[2,1],B[1,1])+ min(A[2,2],B[2,1])
    C[2,2]<-min(A[2,1],B[1,2])+ min(A[2,2],B[2,2])
    

    ?

    我知道我可以通过旋转来完成,但我正在寻找更快的解决方案。

    result <- matrix(nrow= 2, ncol= 2)
    for(i in 1:2){
      minMat <-t(apply(B,2,function(x) pmin(x, A[i,])))
      result[i,]<-rowSums(minMat)
    }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Thomas Guillerme    6 年前

    一种解决方案可以是使用以下函数(来自上面的一条注释):

    ## Defining the function
    sum.min.row <- function(i, A, B) {
        minMat <-t(apply(B,2,function(x) pmin(x, A[i,])))
        rowSums(minMat)
    }
    
    ## Applying it to the whole matrix
    t(sapply(1:nrow(A), sum.min.row, A, B))
    #      [,1] [,2]
    # [1,]    1    3
    # [2,]    1    2
    

    尽管如此,这仍然不是最优的。。。