2
>> A = sparse([1,2,3,4,5])

A =

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

>> B = sparse([1;2;3;4;5])

B =

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

>> bsxfun(@times, A, B)

ans =

   (1,1)        1
   (2,1)        2
   (3,1)        3
   (4,1)        4
   (5,1)        5
   (1,2)        2
   (2,2)        4
   (3,2)        6
   (4,2)        8
   (5,2)       10
   (1,3)        3
   (2,3)        6
   (3,3)        9
   (4,3)       12
   (5,3)       15
   (1,4)        4
   (2,4)        8
   (3,4)       12
   (4,4)       16
   (5,4)       20
   (1,5)        5
   (2,5)       10
   (3,5)       15
   (4,5)       20
   (5,5)       25

非スパース形式では次のようになります。

>> full(ans)

ans =

     1     2     3     4     5
     2     4     6     8    10
     3     6     9    12    15
     4     8    12    16    20
     5    10    15    20    25

>> 

編集:

これらのスパース ベクトルの行列乗算を行い、スパース配列を返したいと思います。

> class(NRowSums)
[1] "dsparseVector"
attr(,"package")
[1] "Matrix"
> class(NColSums)
[1] "dsparseVector"
attr(,"package")
[1] "Matrix"
> 

NRowSums * NColSums (または、それがスカラーを返す場合は、それらを反転すると思います) データを一時的に格納するために非スパース変数を使用しません。

EDIT2:

私は現在これを持っています:

NSums = tcrossprod(as(NRowSums, "sparseMatrix"), as(NColSums, "sparseMatrix"))

これは、私がやろうとしていること、特に型キャストにとっては少し厄介なようです。また、NRowSum または NColSum のいずれかが存在するすべての要素を計算し、これら 2 つの共通部分だけを計算するのではないため、非常に非効率的です。つまり、この NSums には、元の疎行列よりも約 100 倍多くのエントリがあります。

4

3 に答える 3

3

パッケージ「pracma」を確認してください http://cran.r-project.org/web/packages/pracma/index.html 次に、Matlab と同じように bsxfun() を使用できます。

于 2013-11-26T17:14:40.867 に答える
1

本当に「まばらな」状況にある場合は、おそらく最初から始めたいと思うでしょう。

df <- expand.grid(A=A, B=B)
df$val <- with(df, A*B))
# then pass that triple column set of i,j, and values to the sparse matrix constructors.

現時点では、例が密集しているため、テストには適していません。

于 2012-09-28T22:20:00.140 に答える
0

B配列を最初にAと同じレイアウトに転置することができます。

B = t(B)

次に、2つの配列の外積を呼び出します。

outer(A,B)
于 2012-09-28T20:55:31.397 に答える