2017-05-08 6 views
1

Rでは、関数%*%は行列の乗算を行うことです。例えば 、だから`%*% 'のような関数を定義して行列を操作するR

A = matrix(c(1,2,1,1), ncol=2) 
B = matrix(c(3,0,1,0), ncol=2) 
C = A %*% B 

A 
    [,1] [,2] 
[1,] 1 1 
[2,] 2 1 
B 
    [,1] [,2] 
[1,] 3 1 
[2,] 0 0 
C 
    [,1] [,2] 
[1,] 3 1 
[2,] 6 2 

、C [1、1] [1,1] * Bが= [1,1] + A [1,2] * B [2,1]。 このようにしてCの他の元素も得られる。

この機能の速度は非常に速いです。私はこの関数がCまたはC++で書かれていると思います。

ここで、I Dは%%のB. を=ようにDの所望の結果は以下の通りであるべき%!%利用Rという名前の別の関数を定義する:!において

D = matrix(c(3,1,2,2), ncol=2, byrow=T) 
D 
    [,1] [,2] 
[1,] 3 1 
[2,] 2 2 

D[1, 1] = abs(A[1,1]-B[1,1]) + abs(A[1,2]-B[2,1]) 

Dのその他のエントリは、最初のエントリと同じ方法で計算されます。

formual:Aの

enter image description here

寸法は、mがnです。 Bの寸法は、n×pである。そしてmはnに等しくてもよい。 nはpに等しくてもよい。

このように、この定義方法は%!%ですか?現在、私はsapplyを使ってこの関数を定義しました。しかし、私の機能の速度は%*%よりはるかに遅く、他のはるかに効率的なアプローチがあるのだろうかと思っています。

私の定義は次のとおりです。ここで

`%!%` <- function(A, B) { 
    E <- sapply(1:ncol(t(A)), function(x){ 
    colSums(abs(B - t(A)[,x]), na.rm=TRUE) 
    }) 
    return(t(E)) 
} 
+0

あなたの情報はThxです。 @李哲源ZheyuanLi –

+0

あなたの機能が不十分です。他の3つのエントリを指定せず、他のディメンションを定義しないままにしておくと、2x2の場合に1つのエントリが何であるかを教えてください。私はおそらくそれを困惑させることができるかもしれませんが、例ではなく明確な定義を与えたいと思うでしょう。 –

+0

その他のエントリは、最初のエントリと同じ方法で計算されます。私の更新を参照してください。どうも。 @JohnColeman –

答えて

2

一つの試みである。比較の目的のために

sum.abs.dif <- function(u,v){sum(abs(as.vector(u)-as.vector(v)))} 

`%!%` <- function(A,B){ 
    m <- nrow(A) 
    n <- ncol(A) #assumed == nrow(A) 
    p <- ncol(B) 
    indices <- expand.grid(1:m,1:p) 
    vals <- apply(indices,1,function(v) sum.abs.dif(A[v[1],],B[,v[2]])) 
    matrix(vals,nrow = m) 
} 

、私はあなたのコードを取り、それ%?%吹き替えしてから(あなたのサンプルA,B上)マイクロベンチマークを実行しました:

> library(microbenchmark) 
> microbenchmark(A %!% B, A %?% B) 
Unit: microseconds 
    expr  min  lq  mean median  uq  max neval 
A %!% B 180.142 188.813 196.50320 193.7675 198.8990 332.677 100 
A %?% B 43.532 47.602 54.55985 55.0340 57.3345 131.656 100 

したがって、あなたのコードは私の4倍の速さです。これは、あなたが現在持っているものよりもはるかに効率的になることはまずありません(これは改善できないと言っているわけではありません)。 %*%は最適化されたコンパイル済みコードを実行します。 C++エクステンションを作成しない限り、それはあなたが持っているものよりも1桁または2桁の速さであると予想する必要があります。

関連する問題