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の
寸法は、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))
}
あなたの情報はThxです。 @李哲源ZheyuanLi –
あなたの機能が不十分です。他の3つのエントリを指定せず、他のディメンションを定義しないままにしておくと、2x2の場合に1つのエントリが何であるかを教えてください。私はおそらくそれを困惑させることができるかもしれませんが、例ではなく明確な定義を与えたいと思うでしょう。 –
その他のエントリは、最初のエントリと同じ方法で計算されます。私の更新を参照してください。どうも。 @JohnColeman –