【问题标题】:Can I multiply vectors of different lengths?我可以将不同长度的向量相乘吗?
【发布时间】:2014-01-22 13:34:11
【问题描述】:
v1 <- c(1,2)
v2 <- c(3,4,5,6)

有没有办法将这两个向量相乘,结果是向量 dim(1,3)
比如(11,14,17)

这类似于所有可能的 dim(1,2) 乘法组合,例如 (1,2) %x% t(3,4)、(1,2) %x% t(4,5)、(1,2) %x% t(5,6)

看起来很简单,看了也没有运气。

【问题讨论】:

  • 不是有 6 种可能的组合而不是 3 种吗?

标签: r vector vector-multiplication


【解决方案1】:

创建一个 2 行矩阵:

> rbind(v2[-length(v2)],v2[-1])
     [,1] [,2] [,3]
[1,]    3    4    5
[2,]    4    5    6

那么它只是矩阵多:

> v1 %*% rbind(v2[-length(v2)],v2[-1])
     [,1] [,2] [,3]
[1,]   11   14   17

如果你想要一个向量,则为子集:

> (v1 %*% rbind(v2[-length(v2)],v2[-1]))[1,]
[1] 11 14 17

【讨论】:

    【解决方案2】:

    使用 subsetting 和 cbind 创建一个组合矩阵,然后通过乘法应用到它的行。

    apply(cbind(v2[-length(v2)],v2[-1]),1,function(x) v1%*%x)
    [1] 11 14 17
    

    【讨论】:

      【解决方案3】:

      类似于詹姆斯的回答,但可能更简单:

      sapply(1:(length(v2)-1), function(j) sum(v1*v2[j:j+1]))
      

      由于您只是将向量相乘(又名 1×N 矩阵 :-)),因此无需深入研究矩阵运算。

      【讨论】:

        【解决方案4】:

        另一种选择:

        na.omit(filter(v2, rev(v1)))
        

        你也可以使用embed:

        apply(embed(v2, 2), 1, FUN='%*%', rev(v1))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-08
          • 2022-06-17
          • 2012-06-03
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          相关资源
          最近更新 更多