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]))