11

私は次のRように隣接行列を書いています:

neighbours <- array(0, c(100,100))
for (i in 1:100) { neighbours[i,i] = 1 }    #reflexive

しかし、私はそれclass(neighbours)double matrix. それは、より大きなマトリックスではあまりにも多くのスペースを占有します。したがって、型を or に強制したいと思います。integerこれは無向なので、さらに良いことですlogical

しかし...

> class(neighbours[5])
[1] "numeric"
> class(neighbours[5]) <- "integer"
> class(neighbours[5])
[1] "numeric"

それは私に耳を傾けません !

4

5 に答える 5

9

そもそも数値として初期化しないほうがいいですが、それができない場合は、次のように設定しstorage.modeます。

R> neighbours <- array(0, c(100,100))
R> for (i in 1:100) { neighbours[i,i] = 1 }
R> str(neighbours)
 num [1:100, 1:100] 1 0 0 0 0 0 0 0 0 0 ...
R> storage.mode(neighbours) <- "integer"
R> str(neighbours)
 int [1:100, 1:100] 1 0 0 0 0 0 0 0 0 0 ...
R> storage.mode(neighbours) <- "logical"
R> str(neighbours)
 logi [1:100, 1:100] TRUE FALSE FALSE FALSE FALSE FALSE ...
于 2012-09-07T23:29:33.817 に答える
5

既存の数値行列を整数行列に変換する方法をまだ探している人のために:

m2 <- apply (m, c (1, 2), function (x) {
  (as.integer(x))
  })

c(1, 2) は、関数を行と列に適用することを意味します。要素のクラスをテストすると、次のようになります。

> class(m2[1,])
[1] "integer"
> class(m[1,])
[1] "numeric"
> 

既存の数値行列を変換する必要があったため、このようなものを探していました。これは非常に遅い計算の結果であったため、コードを変更すると、単に結果を変換するよりもはるかに時間がかかりました。

于 2015-01-17T16:59:16.383 に答える
3

何かが足りないかもしれませんが、それを論理配列として前もって宣言してみませんか?

neighbors <- array(FALSE, c(100,100))
diag(neighbors) <- TRUE

2つの比較:

> object.size(array(0, c(100,100)))
80200 bytes
> object.size(array(FALSE, c(100,100)))
40200 bytes

編集:論理配列がエントリごとに4Bを占める理由を知りたいのですが...

于 2012-09-07T22:57:13.610 に答える
2

1 つのオプションは、最初に整数 0 ( ) を入力してから、対角線を整数 1 ( )0Lに置き換えることです。1L

m <- matrix(0L, 100, 100)
diag(m) <- 1L

これは、R で対角行列を作成するより簡単な方法の半分のサイズです。

m2 <- diag(1L, 100, 100)

> object.size(m)
40200 bytes
> object.size(m2)
80200 bytes

したがって、整数行列mを割り当ててから対角を変更すると、最もコンパクトな密行列が得られます。

于 2012-09-07T22:58:55.367 に答える
2

パッケージ Matrix (現在は標準パッケージ) には sparseMatrix スーパークラスがあります。疎な対角行列が必要な場合は、次のように作成できます

library(Matrix) 
Matrix(diag(1,4) , sparse=TRUE)
#---------
4 x 4 sparse Matrix of class "dsCMatrix"

[1,] 1 . . .
[2,] . 1 . .
[3,] . . 1 .
[4,] . . . 1

更なる考察。行列のモードを整数に変更したいが、密度が高いままであることを気にしない場合:

> m <- matrix(rnorm(25), 5)
> m[] <- as.integer(m)  
# you do need those square-brackets or the structure becomes a dimensionless vector.
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0   -1    0    0
[2,]    1    0    0    0    0
[3,]    1    0    0    0    0
[4,]    0    0    0    0    0
[5,]    0    0    0   -1    0

Gavin のコメントによって促されたさらに別の考え: 「隣接関係」を表すことが目標であり、そのサンプル空間が非常に大きい場合は、単純に sparseMatrix クラスをモデルとして使用し、代わりに、列のペア.. sparseMatrices が行、列、および値を保持する方法は正確ではありませんが、2列のストレージモードが問題に役立つ場合があります。「igraph」パッケージの実際の例を参照してください。あなたの問題は無向グラフとして表されると思います。

于 2012-09-07T23:01:15.933 に答える