2

RのMatrixパッケージから作成されたスパース行列があります。行列の各エントリを繰り返し処理して操作を実行し、元の行列と同じインデックスを持つ別のスパース行列に結果を保存したいと思います。

たとえば、スパース行列Aがあるとします。

1 . 1
2 . .
. . 4

ColSumsは次のようになります。

3 . 5

RowSumsは次のようになります。

2
2
4

Aを繰り返してこれを実行したい

(1,1) > 3*2
(2,1) > 2*3
(1,3) > 2*5
(3,3) > 4*5

Bの作成:

6 . 10
6 . .
. . 20

ベクトル化された方法でこれを行うにはどうすればよいですか?

関数fooは次のようになると思います。

B=fooMap(A,fun)

そして、楽しみは次のようになります:

fun(row,col) = RowSums(row) * ColSums(col)

fooMapとは何ですか?

編集:

私はflodelのソリューションを使用しました。サマリーを使用してスパース行列をi、j、xデータフレームに変換し、with&friendsを使用してそのフレームで操作を実行し、結果をスパース行列に戻します。この手法では、with/within演算子はfooMapです。スパース行列は、最初にi、j、xデータフレームに変換する必要があります。これにより、with/withinを使用できます。

これがこの特定の問題を解決したワンライナーです。

B = with(summary(A), sparseMatrix(i=i, j=j, x = rowSums(A)[i] * colSums(A)[j]))
4

2 に答える 2

4

スパース行列に対して要素ごとの演算を行うときはいつでも、行列自体とそのsummary表現の間を行ったり来たりします。

summ.B <- summary(A)
summ.B <- within(summ.B, x <- rowSums(A)[i]*colSums(A)[j])
B <- sparseMatrix(i = summ.B$i, j = summ.B$j, x = summ.B$x)
B
# 3 x 3 sparse Matrix of class "dgCMatrix"
#            
# [1,] 6 . 10
# [2,] 6 .  .
# [3,] . . 20
于 2012-09-29T10:54:17.110 に答える
2

これは、各ステップでスパース行列を処理するアプローチです。

## Load library and create example sparse matrix
library(Matrix)
m <- sparseMatrix(i = c(1,2,1,3), j = c(1,1,3,3), x = c(1,2,1,4))

## Multiply each cell by its respective row and column sums.
Diagonal(x = rowSums(m)) %*% (1*(m!=0)) %*% Diagonal(x = colSums(m))
# 3 x 3 sparse Matrix of class "dgCMatrix"
#            
# [1,] 6 . 10
# [2,] 6 .  .
# [3,] . . 20

1*inは、数値行列クラス「dgCMatrix」に戻ること(1*(m!=0))によって生成されたクラス「lgCMatrix」の論理行列を強制するために使用されています。代わりに、より長い(しかしおそらくより明確な)代替手段を使用します。)m!=0as(m!=0, "dgCMatrix")

于 2012-09-29T02:53:45.710 に答える