【问题标题】:Combining the product of matrix columns into a new matrix将矩阵列的乘积组合成一个新矩阵
【发布时间】:2021-12-08 05:24:27
【问题描述】:

我有一个 10 x 6 矩阵,我想将 2:6 列乘以第 1 列,然后将 3:6 列乘以第 2 列,依此类推,直到剩下第 5 列 * 第 6 列。矩阵如下。

    M12.7 <- matrix(data = 1:60, nrow = 10, ncol = 6)
       [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1   11   21   31   41   51
 [2,]    2   12   22   32   42   52
 [3,]    3   13   23   33   43   53
 [4,]    4   14   24   34   44   54
 [5,]    5   15   25   35   45   55
 [6,]    6   16   26   36   46   56
 [7,]    7   17   27   37   47   57
 [8,]    8   18   28   38   48   58
 [9,]    9   19   29   39   49   59
[10,]   10   20   30   40   50   60

这应该会产生 5 个矩阵,总共 15 列。然后我想将这些矩阵组合成一个 10 x 15 矩阵。我写了一个函数,可以让我到达那里。但我不能将它应用于整个参考矩阵,在这种情况下是 M12.7。功能是:

function(datamatrix, column, colz) { 
   datamatrix[, column] * datamatrix[, (column+1):colz]
}

函数中的datamatrix不是data.matrix。非常感谢任何帮助

【问题讨论】:

    标签: r


    【解决方案1】:
    s <- seq(ncol(M12.7)-1)
    do.call(cbind, lapply(s, function(x)M12.7[,x]*M12.7[, -seq(x)]))
    
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
     [1,]   11   21   31   41   51  231  341  451  561   651   861  1071  1271  1581  2091
     [2,]   24   44   64   84  104  264  384  504  624   704   924  1144  1344  1664  2184
     [3,]   39   69   99  129  159  299  429  559  689   759   989  1219  1419  1749  2279
     [4,]   56   96  136  176  216  336  476  616  756   816  1056  1296  1496  1836  2376
     [5,]   75  125  175  225  275  375  525  675  825   875  1125  1375  1575  1925  2475
     [6,]   96  156  216  276  336  416  576  736  896   936  1196  1456  1656  2016  2576
     [7,]  119  189  259  329  399  459  629  799  969   999  1269  1539  1739  2109  2679
     [8,]  144  224  304  384  464  504  684  864 1044  1064  1344  1624  1824  2204  2784
     [9,]  171  261  351  441  531  551  741  931 1121  1131  1421  1711  1911  2301  2891
    [10,]  200  300  400  500  600  600  800 1000 1200  1200  1500  1800  2000  2400  3000
    

    另一种方式:

    s <- seq(ncol(M12.7) -1)
    n <- sequence(rev(s))+1
    p <- cumsum(n==2)
    
    M12.7[, p] *M12.7[, n+p-1]
    

    【讨论】:

      【解决方案2】:

      如果我理解正确,我们可以使用累积积cumprod 函数应用于每一行:

      t(apply(M12.7, MARGIN = 1, FUN = cumprod))
            [,1] [,2] [,3]   [,4]     [,5]      [,6]
       [1,]    1   11  231   7161   293601  14973651
       [2,]    2   24  528  16896   709632  36900864
       [3,]    3   39  897  29601  1272843  67460679
       [4,]    4   56 1344  45696  2010624 108573696
       [5,]    5   75 1875  65625  2953125 162421875
       [6,]    6   96 2496  89856  4133376 231469056
       [7,]    7  119 3213 118881  5587407 318482199
       [8,]    8  144 4032 153216  7354368 426553344
       [9,]    9  171 4959 193401  9476649 559122291
      [10,]   10  200 6000 240000 12000000 720000000
      

      【讨论】:

      • 好吧,显然不是,经过编辑:\
      【解决方案3】:

      matrixStats中有rowCumprods

      library(matrixStats)
      rowCumprods(M12.7)
            [,1] [,2] [,3]   [,4]     [,5]      [,6]
       [1,]    1   11  231   7161   293601  14973651
       [2,]    2   24  528  16896   709632  36900864
       [3,]    3   39  897  29601  1272843  67460679
       [4,]    4   56 1344  45696  2010624 108573696
       [5,]    5   75 1875  65625  2953125 162421875
       [6,]    6   96 2496  89856  4133376 231469056
       [7,]    7  119 3213 118881  5587407 318482199
       [8,]    8  144 4032 153216  7354368 426553344
       [9,]    9  171 4959 193401  9476649 559122291
      [10,]   10  200 6000 240000 12000000 720000000
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        • 2017-07-20
        • 1970-01-01
        • 2012-09-22
        • 2013-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多