如何逐个元素的元素乘以向量列表的元素(匹配元素)

时间:2017-11-07 07:43:27

标签: r

想法:

假设我有一个10向量列表,并希望按列的特定值乘以每个向量。也就是说,第一个矢量值仅乘以每个数组的第一个元素。然后,第二个矢量值仅乘以每个阵列的第二个元素。对所有载体都这样做。由于我有10个向量(每个都有100个值)和100个数组,因此每个都有10个非零值。然后,我想如上所述逐个进行乘法。

实施例

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

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

  4. 为所有其他载体执行此操作。

  5. 数值示例:

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

    [[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)
    

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

    , , 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是一个列表`)

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

    请问,好吗?

1 个答案:

答案 0 :(得分:0)

我们可以根据非零值进行分配。正如vector&#39; x&#39;与每个2D阵列切片中的非零值的长度相同,我们可以利用&#39; x&#39;

的回收
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(&#39; x&#39;),然后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