大規模なデータセットでは非常に遅いため、作成したコードを最適化しようとしています。以下が行列演算で実行できるかどうかはわかりません。誰かがそれを高速化するための提案をしていただければ幸いです。
ゼロと整数を含む行列があり、個々の列のエントリをエントリ内の整数の絶対数だけシフトダウンしたいと考えています。
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 -4 0
[3,] 4 0 0
[4,] -3 -2 0
[5,] 0 2 -1
[6,] 2 -2 0
[7,] 0 0 0
[8,] -3 -3 0
私が使用しているコードは次のとおりです。
#data
A<-matrix(data=c(0,0,4,-3,0,2,0,-3,0,-4,0,-2,2,-2,0,-3,0,0,0,0,-1,0,0,0),nrow=8,ncol=3)
#shift function
shift<-function(x)
{
#create the output matrix
out<-matrix(data=0,nrow=8,ncol=1)
#for loop to create the shift matrix
for(i in seq(1,8,by=1))
{
if(i+abs(x[i])<=8)
{
#find the non zero
if(x[i]!=0)
{
#if there is already a number put zero
if(out[i+abs(x[i]),1]!=0)
{
out[i+abs(x[i]),1]=0
} else {
#shift
out[i+abs(x[i]),1]=x[i]
}
}
}
}
#return object
return(out)
}
#run the logic
shift_mat<-sapply(1:ncol(A),FUN=function(k) shift(A[,k]))
結果は次のとおりです。
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
[4,] 0 0 0
[5,] 0 0 0
[6,] 0 0 -1
[7,] 0 2 0
[8,] 2 -2 0
各列のルールは次のとおりです。
- 上から始めて、ゼロ以外の最初のエントリを見つけます
- そのエントリの絶対数だけ下にシフトします
- 対象のポイントに別のエントリがある場合は、ゼロを入力します
- 次の列で繰り返します
ありがとう、
ニコス