【问题标题】:Multiply matrix with a vector row wise [duplicate]将矩阵与向量行相乘[重复]
【发布时间】:2015-08-03 13:26:02
【问题描述】:

我有一个逻辑矩阵,我需要使用 apply 将每一列乘以该列的总和。 例如:

> a
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    0    0    0    0
[3,]    1    1    0    1
[4,]    1    0    0    1
> b <- colSums(a)
> b
[1] 3 2 1 3

我想得到以下矩阵:

 > a
     [,1] [,2] [,3] [,4]
[1,]    3    2    1    3
[2,]    0    0    0    0
[3,]    3    2    0    3
[4,]    3    0    0    3

我使用 for 但由于我需要将我的函数应用到一个巨大的数据集,我需要使用 apply 进行编码。谢谢。

【问题讨论】:

  • 只是a * b 做你想做的事吗?
  • 可以,但是需要很长时间才能运行。如果我使用 biganalystics 的函数 apply 不会花费很长时间,这就是我需要使用 apply 的原因。

标签: r matrix


【解决方案1】:

您可以对矩阵'a'进行转置(t),然后与向量('b')相乘,再对输出进行转置(t)得到想要的结果。

 t(t(a)*b)

或者我们可以通过复制 'b' 的元素来使 'a' 和 'b' 的长度相同。通过执行b[col(a)],我们得到由col 提供的索引复制的'b' 的每个元素。

 a*b[col(a)]

为了更好的理解

  col(a)
  #     [,1] [,2] [,3] [,4]
  #[1,]    1    2    3    4
  #[2,]    1    2    3    4
  #[3,]    1    2    3    4
  #[4,]    1    2    3    4

 b[col(a)] #is a vector
 #[1] 3 3 3 3 2 2 2 2 1 1 1 1 3 3 3 3

 a*b[col(a)]
 #     [,1] [,2] [,3] [,4]
 #[1,]    3    2    1    3
 #[2,]    0    0    0    0
 #[3,]    3    2    0    3
 #[4,]    3    0    0    3

【讨论】:

  • 感谢您的回答 akrun。我试过了,但 R 无法运行该操作,因为我有一个巨大的矩阵(大内存)
  • @TaoufiqMouhcine 在这种情况下,apply 会更合适,因为大矩阵会占用内存。我没有阅读您提到大数据的部分(对不起!)
【解决方案2】:

除了@akrun 的回答,如果你真的想用apply

apply(a,2,function(x)x*sum(x))
#     [,1] [,2] [,3] [,4]
#[1,]    3    2    1    3
#[2,]    0    0    0    0
#[3,]    3    2    0    3
#[4,]    3    0    0    3

2 表示您在列(即第二维)上工作。所以每个操作都是在对应于一列的向量上完成的,因此使用sum(适用于向量)而不是colSums(适用于矩阵)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多