2016-10-13 8 views
2

小さな行列から大きな行列を作成しようとしています。大きなR行列を高速に埋め込む方法

のは、私は2人の行列があるとしましょう:

set.seed(1) 
mat1 <- matrix(rnorm(100*20),nrow=100,ncol=20) 
rownames(mat1) <- paste("R1",1:100,sep=".") 
colnames(mat1) <- paste("F1",1:20,sep=".") 

mat2 <- matrix(rnorm(200*10),nrow=200,ncol=10) 
rownames(mat2) <- paste("R2",1:200,sep=".") 
colnames(mat2) <- paste("F2",1:10,sep=".") 

私が作成する必要があり、大きな行列がmat1mat2内のすべての行の組み合わせを保持する、と列のその数はncol(mat1)+ncol(mat2)次のようになります。

combined.rownames <- expand.grid(rownames(mat1),rownames(mat2)) 

big.mat <- matrix(NA,nrow=nrow(mat1)*nrow(mat2),ncol=ncol(mat1)+ncol(mat2)) 
rownames(big.mat) <- paste(combined.rownames$Var1,combined.rownames$Var2,sep="_") 

mat1は、1:ncol(mat1)の列に対応するbig.matのすべての行を入力します。

...、 matnとその寸法は、 mat1mat2

idx2 <- match(combined.rownames$Var2,rownames(mat2)) 
big.mat[,(ncol(mat1)+1):(ncol(mat1)+ncol(mat2))] <- mat2[idx2,] 

を現実に私は行列のリストを持っている:

idx1 <- match(combined.rownames$Var1,rownames(mat1)) 
big.mat[,1:ncol(mat1)] <- mat1[idx1,] 

mat2は列(ncol(mat1)+1):(ncol(mat1)+ncol(mat2))でそれに対応big.mat内のすべての行を移入しますこの例よりも高い。

私の質問は、より高速で効率的な方法であるかどうかです。big.mat

私の行列は疎ではありません。

答えて

0

この質問では、より小さな行列を使用して「正解」を指定したかどうかはわかりますが、と考えています。これは「Kroneckerプロダクト」を再発明するためのものです。私が正しいとすれば、もっと小さな例ではそれだけです。

mat1 <- matrix(1:20,nrow=4,ncol=5) 
rownames(mat1) <- paste("R1",1:4,sep=".") 
colnames(mat1) <- paste("F1",1:5,sep=".") 
mat2 <- matrix(1:6,nrow=2,ncol=3) 
rownames(mat2) <- paste("R2",1:2,sep=".") 
colnames(mat2) <- paste("F2",1:3,sep=".") 

big <- kronecker(mat1, mat2) 
rownames(big) <- combined.rownames 
rownames(big) <- paste(combined.rownames$Var1, combined.rownames$Var2,sep="_") 

> big 
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] 
R1.1_R2.1 1 3 5 5 15 25 9 27 45 13 39 65 
R1.2_R2.1 2 4 6 10 20 30 18 36 54 26 52 78 
R1.3_R2.1 2 6 10 6 18 30 10 30 50 14 42 70 
R1.4_R2.1 4 8 12 12 24 36 20 40 60 28 56 84 
R1.1_R2.2 3 9 15 7 21 35 11 33 55 15 45 75 
R1.2_R2.2 6 12 18 14 28 42 22 44 66 30 60 90 
R1.3_R2.2 4 12 20 8 24 40 12 36 60 16 48 80 
R1.4_R2.2 8 16 24 16 32 48 24 48 72 32 64 96 
      [,13] [,14] [,15] 
R1.1_R2.1 17 51 85 
R1.2_R2.1 34 68 102 
R1.3_R2.1 18 54 90 
R1.4_R2.1 36 72 108 
R1.1_R2.2 19 57 95 
R1.2_R2.2 38 76 114 
R1.3_R2.2 20 60 100 
R1.4_R2.2 40 80 120 

はまだ列の数が、製品ではなくCOLSの数の和であるので、これは本当に答えであるかどうかについて、いくつかのパズルを持っています。 kroneckerは、組み合わせ機能として*を使用しますが、「ベクトル化」されている限り、別の機能を使用できます。

1

インデックスとして行名を使用することは非効率的だと思います。

ind <- expand.grid(1:nrow(mat1), 1:nrow(mat2)) 
big.mat2 <- cbind(mat1[ind[,1],], mat2[ind[,2],]) 
関連する問題