5

次のマトリックス マットがあるとします。これはバイナリ インジケーター マトリックスです。

mat<-matrix(c(1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1), byrow=T, nrow= 3)

> mat
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    0    0    0    0
[2,]    0    0    1    1    0    0
[3,]    0    0    0    0    1    1

この行列には 3 行しかありません。対角線上の 1 のペアの同じパターンで、10000 行の行を作成する必要があります。たとえば、5 行の場合、5 x 10 の行列が必要です。

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    0    0    0    0    0    0    0     0
[2,]    0    0    1    1    0    0    0    0    0     0
[3,]    0    0    0    0    1    1    0    0    0     0
[4,]    0    0    0    0    0    0    1    1    0     0
[5,]    0    0    0    0    0    0    0    0    1     1

誰もそれを行う簡単な方法を知っていますか? どうもありがとう

4

5 に答える 5

4

これはまばらな行列であるため、ゼロ以外のエントリを参照する方がはるかに優れています。これにより、RAM が節約され、行列の自動生成が容易になります。

各エントリは (i,j,x) としてインデックス付けされ、行、列、および値を参照します。埋めたい N (たとえば N = 10) 行があるとします。この場合、行ごとに 2 つのエントリが生成されます (i以下のコードでは , でインデックス付けされています)。各列は 1 回だけ使用されるため、2*N 個の一意の列値があります。ゼロ以外の各エントリは 1 です。

これを生成するためのコードは次のとおりです。

N = 10
i = rep(1:N, each = 2)
j = 1:(2*N)
v = 1

library(Matrix)
mat = sparseMatrix(i = i, j = j, x = v)

結果のマトリックスは次のとおりです。

> mat
10 x 20 sparse Matrix of class "dgCMatrix"

 [1,] 1 1 . . . . . . . . . . . . . . . . . .
 [2,] . . 1 1 . . . . . . . . . . . . . . . .
 [3,] . . . . 1 1 . . . . . . . . . . . . . .
 [4,] . . . . . . 1 1 . . . . . . . . . . . .
 [5,] . . . . . . . . 1 1 . . . . . . . . . .
 [6,] . . . . . . . . . . 1 1 . . . . . . . .
 [7,] . . . . . . . . . . . . 1 1 . . . . . .
 [8,] . . . . . . . . . . . . . . 1 1 . . . .
 [9,] . . . . . . . . . . . . . . . . 1 1 . .
[10,] . . . . . . . . . . . . . . . . . . 1 1

上記のコードを使用して N = 10000 に設定するだけで、行列が作成されます。

追加のボーナスとして、目的の行列 (N = 1E5) は 321424 バイトしか消費しません。対照的に、サイズが 10K x 20K の標準的な密行列は、数値 (つまり 8 バイト) エントリを使用して 1.6GB を使用します。彼らが「連絡先」で言ったように、それはスペースのひどい無駄のように思えますよね?

于 2012-02-01T13:57:18.613 に答える
1

マトリックスに他の多くの値を入力するつもりでない限り、おそらく Iterator の疎マトリックス ソリューションが必要です。そうは言っても、行列の非疎バージョンを生成するかわいい方法は次のとおりです。

double_diag <- function(n)
{
  matrix(rep(diag(n), each = 2), byrow = TRUE, nrow = n)
}
double_diag(5)
于 2012-02-01T16:45:31.337 に答える
1

@VincentZooneKynd には優れた解決策がありますが、警告が表示されます。警告を回避するバリアントを次に示します。

n <- 5
matrix(rep(c(1,1,rep(0,2*n)), len=2*n*n), n, byrow=TRUE)
于 2012-02-01T18:49:08.873 に答える
1

行列を満たすのに十分な要素を提供しない場合、それらは再利用されます。2 つの 1 と n 個の 0 (最初の行と 2 番目の行の最初の 2 つの要素) を提供すると、目的の行列が得られます。

n <- 5
matrix( 
  c(1,1,rep(0,2*n)), 
  byrow=TRUE, nr=n, nc=2*n 
)
于 2012-02-01T13:31:21.987 に答える