【问题标题】:How to multiply elements of a list of vectors by elements of arrays one by one (matches element)如何将向量列表的元素与数组的元素一一相乘(匹配元素)
【发布时间】:2017-11-07 07:43:27
【问题描述】:

想法:

假设我有一个10 向量列表,并希望将每个向量乘以列的数组的特定值。也就是说,第一个向量值仅乘以每个数组的第一个元素。然后,第二个向量值只乘以每个数组的第二个元素。对所有向量都这样做。因为我有10 向量(每个都有100 值)和100 数组,所以每个都有10 非零值。然后,我想按照上面的描述进行一一相乘。

示例,

  1. 取列表的第一个向量。 x[[1]] 然后将它的每个元素乘以数组的每个第一个元素

  2. 然后第二个向量值乘以数组的每个第二个元素

  3. 然后,第三个向量值乘以数组的每个第三个元素

  4. 对所有其他向量执行此操作。

数值例子:

假设我有一个向量列表,以下向量是我列表的第一个和第二个向量。

[[1]]
 [1] 2.174090 1.666464 1.915763 2.282967 2.407327 1.386437 2.854528 1.896338 2.010713 1.013387 .......... (`100` values)

[[2]]
 [1]  2.3020147  3.3311029 -0.3103701  3.2445878  5.6261224  5.2914477 -1.0621042  3.0790536  3.6186598
[10]  4.1846937 ........ (`100` values)

[[3]]
 [1]  0.42808525  4.02348551 -2.31160703  5.56077594  2.83856320 -0.02850242  1.57480238 -2.68603276
 [9]  2.34598854  4.14115289 ....(`100` values)

假设我有一个包含 10 值的数组列表 (100)。让我们下面的数组是我的数组列表的第一个和第二个数组。

, , 1

           [,1]        [,2]       [,3]      [,4] [,5]
[1,]  0.0000000  0.00000000  0.0000000  0.000000    0
[2,] -0.4610817  0.00000000  0.0000000  0.000000    0
[3,]  0.4697426 -0.07296078  0.0000000  0.000000    0
[4,] -0.2790043 -0.77459992 -0.7478920  0.000000    0
[5,] -0.2156273 -2.59804286 -0.9390597 -1.746925    0

    , , 2

            [,1]       [,2]       [,3]      [,4] [,5]
[1,]  0.00000000  0.0000000  0.0000000  0.000000    0
[2,] -0.21896586  0.0000000  0.0000000  0.000000    0
[3,] -0.09066381  0.2920374  0.0000000  0.000000    0
[4,]  1.27289131 -0.2748794  1.0862465  0.000000    0
[5,] -1.20050567 -1.0934879 -0.7707806 -2.180104    0

然后我想将第一个向量的第一个元素乘以数组的第一个非零值。即2.174090 * -0.4610817 然后,第一个向量的第二个元素将乘以第二个数组的第一个元素,即1.666464 * -0.21896586 。然后,第二个向量的第一个元素乘以第一个数组的第二个元素,即2.3020147 * 0.4697426第二个向量的第二个元素乘以第二个数组的第二个元素3.3311029 * -0.09066381

第三个向量乘以数组的每个第三个元素。

0.42808525 * -0.2790043

即:

第一个向量的元素只乘以数组的第一个元素(一个接一个)。然后,第二个向量只乘以数组的第二个元素

代码:

 a <- array(rnorm(5 * 5 * 100), c(5, 5, 100))
 for(k in seq(dim(a)[3])) a[,,k][upper.tri(a[,,k], diag = TRUE)] <- 0
 a



 x <- rnorm(100,2,2)
 
  x <- rep(list(x), 10)

我尝试了答案(非常感谢)但出现错误:(x is a list`)

 > a[a!=0] <- a[a!=0]*x
Error in a[a != 0] * x : non-numeric argument to binary operator

有什么想法吗?

【问题讨论】:

  • @akrun 谢谢,不,这完全不同。这将每个向量乘以每个数组。这里每个元素一个元素。
  • 试试a[a!=0] &lt;- a[a!=0]*x
  • @akrun 非常感谢。我会试试看。
  • 好的,在这种情况下,更新的答案应该可以工作
  • 非常感谢。真的很感激。

标签: r


【解决方案1】:

我们可以根据非零值进行赋值。由于vector 'x' 的长度与二维数组每个切片中非零值的个数相同,我们可以利用 'x' 的回收利用

a[a!=0] <- a[a!=0]*x 
dim(a)
#[1]  5  5 10

赋值前的值

a[2,1,1]*x[1]
#[1] 1.462893
a[2,1,2]*x[1]
#[1] -0.2332104

分配后

a[2, 1, 1]
#[1] 1.462893
a[2, 1, 2]
#[1] -0.2332104

如果我们需要乘以 list ('x'),然后 unlist 它并创建一个 matrix byrow=TRUE 以使元素正确相乘

a[a != 0] <- a[a != 0]*do.call(rbind, x)

赋值前的值

a[2,1,1]*x[[1]][1]
#[1] 0.2297043

a[3,1,1]*x[[2]][1]
#[1] 0.1796345

赋值后的值

a[2, 1, 1]
#[1] 0.2297043
a[3, 1, 1]
#[1] 0.1796345

数据

set.seed(24)
a <- array(rnorm(5 * 5 * 10), c(5, 5, 10))
for(k in seq(dim(a)[3])) a[,,k][upper.tri(a[,,k], diag = TRUE)] <- 0

【讨论】:

  • 非常感谢。但是,它给了我一个向量。我想保存在数组中。
  • @Alice 你做了什么改变吗?在这个例子中,我得到一个数组作为输出,即a[a!=0] &lt;- a[a!=0]*x
  • 没有。我没有。我会再做一次。
  • 我正在尝试。我原来的功能太复杂了,需要时间。我会尽快回复你。非常感谢您的友好和大力帮助。
  • @Alice 在这里,我假设 x 向量的长度相同,即 10,并且与每个数组元素中非零元素的数量相同。
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2023-03-19
  • 2021-04-05
相关资源
最近更新 更多