【问题标题】:Hadamard product for vector list in rr中向量列表的Hadamard产品
【发布时间】:2020-07-07 04:57:41
【问题描述】:

我试图弄清楚如何为元素是行向量的列向量做 Hadamard 乘积(在 R 中)。更准确地说,让X=list(R1,R2)R1R2 是两个相同长度的行向量。我想用A11=R1oR1A12=R1oR2A21=R2oR1A22=R2oR2 创建一个矩阵(显然是一个列表)A=[A11, A12; A21, A22],其中 o 表示 hadamard 产品。关于如何在不使用 R 循环的情况下执行此产品的任何建议,更像是矩阵形式样式?非常感谢。

【问题讨论】:

标签: r


【解决方案1】:

Hadamard 乘积只是入口乘法,即 R 中的 *,但要从下面显示的列表 X 中获得 2x2 矩阵/列表,我们可以尝试以下任何方法。

1) 使用基础 R,我们有以下单行:

X <- list(R1 = 1:3, R2 = 4:6) # test data

m <- matrix(sapply(X, function(x) lapply(X, `*`, x)), 2)

给出这个 2x2 矩阵,我们可以使用m[[i, j]] 提取m 的第 i,j 个元素。

m
##      [,1]      [,2]     
## [1,] Integer,3 Integer,3
## [2,] Integer,3 Integer,3

str(m)
## List of 4
##  $ : int [1:3] 1 4 9
##  $ : int [1:3] 4 10 18
##  $ : int [1:3] 4 10 18
##  $ : int [1:3] 16 25 36
##  - attr(*, "dim")= int [1:2] 2 2

m[[1,2]]
## [1]  4 10 18

2) 甚至更简单但更乏味:

with(X, matrix(list(R1 * R1, R1 * R2, R2 * R1, R2 * R2), 2))

3) 另一种方法是使用outer 生成字符表达式矩阵m.ch,然后对其进行解析和评估。

m.ch <- outer(names(X), names(X), paste, sep = "*")
array(lapply(parse(text = m.ch), eval, X), dim(m.ch))

矩阵作为输出

虽然问题明确指出它需要一个列表作为答案,如果您也对矩阵感兴趣作为输出,这样它的块是 m 的条目,那么我们可以在预安装 Matrix 包的地方使用以下内容使用 R,因此不必安装。

library(Matrix)

Xmat <- do.call("rbind", X)
matrix(t(KhatriRao(Xmat)), 2, byrow = TRUE)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    4    9    4   10   18
## [2,]    4   10   18   16   25   36

或从 (1) 中的 m 导出此矩阵:

matrix(unlist(m), 2, byrow = TRUE)

【讨论】:

  • 感谢格洛腾迪克的快速回复,非常感谢。我喜欢第一种方法。我的下一个问题是如何将(1)中的派生块矩阵 m 用于块矩阵乘积。例如,设 A=array(rep(1,3),c(3,1)), B=A, C=A, D=A。设置库(块矩阵)。 L =list(A=A,B=B,C=C,D=D), mv
  • 您需要使用 ?blockmatrix 中的信息创建一个 blockmatrix 类的对象。如果您想使用它,请仔细阅读并使用该包中的示例。您的问题与该软件包无关,而只是询问了列表输出。
  • 我想我现在明白了。问题是命令 matrix(unlist(m), 2, byrow = TRUE) 返回 m 作为其 [1,2] 元素的块矩阵,例如,看起来像 > m[1,2] [[1]] [ 1] 4 10 18. 但是,如果我们写成 mm=matrix(unlist(m), nrow=2, byrow=TRUE),然后定义 m2=as.blockmatrix(mm,nrowe=1, ncole=3),那么[1,2] 块矩阵元素现在读取为 > m2[1,2] [1] 4 10 18 ,它没有索引 [[1]]。这一切都已解决。再次感谢您为我们指明道路。问候。
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多