【问题标题】:How do I translate this 'sparse' Matlab bsxfun call to R?如何将此“稀疏”Matlab bsxfun 调用转换为 R?
【发布时间】:2012-09-20 18:18:02
【问题描述】:
>> 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 的所有元素,而不仅仅是这两者的交集。也就是说,这个 NSums 中的条目比原始稀疏矩阵中的条目多 100 倍。

【问题讨论】:

    标签: r matlab vectorization bsxfun


    【解决方案1】:

    检查包“pracma”http://cran.r-project.org/web/packages/pracma/index.html 然后你可以像在 Matlab 中一样使用 bsxfun()。

    【讨论】:

      【解决方案2】:

      如果你真的有“稀疏”的情况,我想你可能想从

      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.
      

      目前您的示例不适合测试,因为它很密集。

      【讨论】:

      • 实际数据非常稀疏。我会阅读这些功能并回复。
      • 这种方法(以及我的 tcrossprod 方法)的问题在于它计算所有现有行对或现有列的值。在稀疏数组中,我只需要当前行和当前列。 OR (100x) 显着增加尺寸。稀疏数组中的所有条目是否存在某种高阶映射函数?
      • 在这一点上,我挑战您提供一个可以使用的示例。最好通过编辑在您的问题正文中进行。您当前的示例既不是 R 代码,也不是稀疏矩阵。
      【解决方案3】:

      您可以先将 B 数组转置为与 A 相同的布局:

      B = t(B)
      

      然后调用两个数组的外积:

      outer(A,B)
      

      【讨论】:

      • 我在使用数组时得到了一个有趣的输出。我认为您想改用向量:A &lt;- c(A); outer(A, A)
      • @flodel,你是对的,我认为这与外部认为输入的暗淡有关。例如,A = c(1,2,3,4,5), outer(A,A) 有效,但 outer(t(A),t(A)) 无效
      猜你喜欢
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      相关资源
      最近更新 更多