Rで文字列の行列を操作する関数を定義しようとしています.
{+,*} 行列の乗算
次元 nの 2 つの正方行列AとBの {+,*} 積は、次の要素で定義される 行列Cです: C i,j = Sum k=1,...,n A i,k * B k, j .
たとえば、行列を考えてみましょう M <- matrix(c(a,b,0,0,c,d,0,0,e),3,3)
。M かける M は M <- matrix(c(a^2,a*b+b*c,b*d,0,c^2,c*d+d*e,0,0,e^2),3,3)
です。
{c(,),paste0(,)} 行列の乗算
私が実装したいこの操作のルールは、前に述べた乗算と同じですが、合計は連結であり、積はペーストでなければならないという本質的な変更があります。言い換えると、前の式で が見つかっa+b
た場合、出力は "c(a,b)" になるはずであり、 が見つかった場合はa*b
、これを と読む必要がありますpaste0(a,b)
。
通常のプロパティのいくつか、つまり分配プロパティと 0 要素プロパティを尊重する必要があります。したがって、ifa <- c("q",0,"w")
およびb <- c("e")
then a*b <- c("qe",0,"we")
(そして、計算に影響しないため、0 要素を自由に削除する必要があります。
さらに、等次元行列を乗算しているため、各要素 C i,j = Sum k=1,...,n A i,k * B k,jは として読み取られることになります c("A[i,1]B[1,j]",...,"A[i,n]B[n,j]")
。
簡単にするために、 Bは常に単純な行列であると考えてみましょう。つまり、その各要素は文字列の連結ではなく、アトミック文字列であることを意味します (一般化は後続のステップです)。
例を挙げましょう。A <- matrix(c("a","b",0,0,"c","d",0,0,"e"),3,3)
、そしてmult(A,A) = matrix(c("aa",c("ab","bc"),"bd",0,"cc",c("cd","de"),0,0,"ee"),3,3)
、としましょう mult(mult(A,A),A) = matrix(c("aaa",c("aab","abc","bcc"),c("abd","bcd","bde"),0,"ccc",c("ccd","cde","dee"),0,0,"eee"),3,3)
。
部分的な (動作しない) 実装
0 または文字列の配列 c( s 1 , s 2 ,...) をi,j要素とするnxn 行列M , Nのペアを入力として考えます。出力として、乗算がシンボリック乗算と同様に定義される行列MN = M x Nが必要です。
M i,j の場合、 Mi,j=0である。またはN .,jは 0 MN i,j = paste( M i,. , N .,j ) それ以外の場合 ( の分配特性を使用)
paste()
ベースの行/列の貼り付け機能の(間違って、ゼロを適切にチェックしません)定義を次のように与えました
MijPaste <- function(Row,Col){
if(Col[1]=="0"){
Mij <- 0
} else if(Row[1]=="0"){
Mij <- 0
} else
Mij <- paste(Row,Col,sep="")
return(Mij)
}
行列内に挿入したい要素 Mij が正しい次元ではないため、このステップから乗算関数の適切な定義に進むことができませんでした。したがって、number of items to replace is not a multiple of replacement length
エラーが発生します。私の現在の実装は次のとおりです。
# define the dimension of the matrix, here for example 3
dim <- 3
# define the Multiplication function as an iteration of the MijPaste function
Mult <- function(M1,M2){
#allocate a matrix of dimension nxn
M <- matrix(0,dim,dim)
#for each element i,j define it as the MijPaste of row i column j
for(i in 1:dim){
for(j in 1:dim){
stringi <- M1[i,]
stringj <- M2[,j]
M[i,j] <- MijPaste(stringi,stringj)
}
}
return(M)
}
コードが機能しません。おそらく行列を多次元配列に変更できますが、出力をさらに乗算するための行列として使用できるようにしたいと思います (たとえば、(MxN)xC を定義するため)。
どのようにできるのか?
ありがとうございました!
PS簡単なサンプルマトリックスを使用してコードをテストできます
Matr <- matrix(c("11","12","13","21","22","23","31","32","33"),dim,dim)
そして走っている
Mult(Matr,Matr)