2017-10-20 26 views
0

私は、例えば、ベクターのため正常に動作vectoricedノルム/行列乗算

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

を計算するベクトルのノルムを計算するために行列sigma

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

によって記述されるノルムを有しますx = 1:3

私は、同時に多くのベクトルのノルムを計算したいしかし、それは私が(別のエントリで満たさもちろん)

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

を持っています。

各ベクトルのノルムを同時に計算する方法はありますか? I.あなたはこの単純マトリックス乗算についてどう思いますか

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

答えて

3

を適用し、その後高速である:ここでは

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からのソリューションの亜種:

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

のようなもの:

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

編集:行列の乗算した後に、対角(もちろん)が必要です。

そして、それはとソリューションはあなたが行うことができます

+0

これは私を与えるを行う必要があります –

+0

[OK]を、その後のx%*%シグマ%*%tを(バツ)。それは私のために働いた。 – EugenR

+0

@EugenR不要な要素を計算しています。 – jogo

2

これは "トンに(X)%※%のシグマをエラー:非適合引数"

> 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 
+1

質問は、https://stackoverflow.com/q/21708489/5861244の複製に近いです。 –