【问题标题】:vectoriced norm/matrix multiplication向量化范数/矩阵乘法
【发布时间】:2018-04-01 09:46:29
【问题描述】:

我有一个由矩阵sigma 描述的范数

sigma <- matrix(c(1,0.5,0,0.5,1,0,0,0,1),3,3))

为了计算我计算的向量的范数

t(x) %*% sigma %*% x

这适用于矢量,例如x = 1:3.

但是我想同时计算多个向量的范数,也就是说我有

x <- t(matrix(rep(1:3, 10),3,10))

(当然填充了不同的条目)。

有没有办法同时计算每个向量的范数? IE。像

lapply(1:10, function(i) t(x[i,]) %*% sigma %*% x[i,])

【问题讨论】:

    标签: r matrix vectorization


    【解决方案1】:

    你可以这样做:

    sigma <- matrix(c(1,0.5,0,0.5,1,0,0,0,1),3,3)
    x <- t(matrix(rep(1:3, 10),3,10))
    
    mynorm <- function(x, sig) t(x) %*% sig %*% x
    apply(x, 1, mynorm, sig=sigma)
    

    这是tcrossprod()的变体:

    mynorm <- function(x, sig) tcrossprod(x, sig) %*% x
    apply(x, 1, mynorm, sig=sigma)
    

    这是基准(包括来自compute only diagonals of matrix multiplication in R 的解决方案的变体,感谢@Benjamin 提供链接):

    mynorm1 <- function(x, sig) t(x) %*% sig %*% x
    mynorm2 <- function(x, sig) tcrossprod(x, sig) %*% x
    
    microbenchmark(n1=apply(x, 1, mynorm1, sig=sigma), 
                   n2=apply(x, 1, mynorm2, sig=sigma), 
                   n3 = colSums(t(x) * (sigma %*% t(x))),
                   n4 = rowSums(x * t(sigma %*% t(x))),
                   n5 = rowSums(x * (x %*% t(sigma) )),
                   n6 = rowSums(x * tcrossprod(x, sigma)),
                   Eugen1 = diag(x %*% sigma %*% t(x)),
                   Eugen2 = diag(x %*% tcrossprod(sigma, x)),
                   unit="relative")
    

    【讨论】:

      【解决方案2】:

      应该这样做

      > sigma <- matrix(c(1,0.5,0,0.5,1,0,0,0,1),3,3)
      > x <- t(matrix(rep(1:30, 10),3,10))
      > 
      > # should give
      > t(x[1, ]) %*% sigma %*% x[1, ]
           [,1]
      [1,]   16
      > t(x[2, ]) %*% sigma %*% x[2, ]
           [,1]
      [1,]   97
      > 
      > # which you can get by
      > rowSums((x %*% sigma) * x)
       [1]   16   97  250  475  772 1141 1582 2095 2680 3337
      

      【讨论】:

      【解决方案3】:

      你怎么看这个简单的矩阵乘法:

       diag(t(x) %*% sigma %*% x)
      

      编辑:在矩阵乘法之后,你需要对角线(当然)。

      然后它比 apply

      的解决方案更快

      【讨论】:

      • 这给了我“t(x) %*% sigma 中的错误:不一致的参数”
      • @EugenR 您正在计算不需要的元素。
      • @EugenR 是的,可能会更快(请参阅基准测试中的变体 Eugen2)。速度最终取决于矩阵的维度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多