首页 > 解决方案 > 我需要在矩阵中的列之间创建一个累积索引

问题描述

我需要在我的数据中的列之间创建一个累积索引。我将问题设置如下

#accumulation function
mat1 <- matrix(nrow=16, ncol =4)
mat1[1,] <- c(1,1,1,1)
mat1[2:16,] <- 1+rnorm(60,0,0.1)

   [,1]      [,2]      [,3]      [,4]
 [1,] 1.0000000 1.0000000 1.0000000 1.0000000
 [2,] 0.9120755 0.9345682 0.8533162 0.8737582
 [3,] 0.7838427 0.9691806 0.8216284 0.9863669
 [4,] 0.9095204 1.1906031 1.0253083 1.0700338
 [5,] 1.0202524 0.9974672 1.1348315 1.1115018
 [6,] 0.9456184 1.1250529 1.0348011 0.9323336
 [7,] 1.0053195 0.9917475 1.0178855 1.0880626
 [8,] 0.9550709 0.9107060 0.8876688 0.9060996
 [9,] 1.0728177 1.0559643 0.9161789 0.9711522
[10,] 0.9579642 1.0082560 0.9833227 0.9306639
[11,] 1.0044883 1.1323498 1.0388025 0.8926033
[12,] 0.8777846 0.9940302 0.8314166 0.8479962
[13,] 1.1042297 0.9767410 0.9355374 0.8859680
[14,] 1.1245737 0.8291948 1.0491585 0.9887672
[15,] 0.9687700 0.9915095 0.8962534 1.0220163
[16,] 0.9432597 1.0310273 0.9288159 1.0838243



所需的输出采用每列中条目的乘积,直到每个行号。

所以:

mat2 <- matrix(nrow=16, ncol=4)
mat2[1,] <- c(1,1,1,1)
mat2[2,] <- mat1[1,]*mat1[2,]
mat2[3,] <-mat1[1,]*mat1[2,]*mat1[3,]
mat2[4,] <-mat1[1,]*mat1[2,]*mat1[3,]*mat1[4,]

依此类推,直到第 16 行。这个想法是将 mat1 中所有条目的乘积累积到特定的行号。所以 mat2 的第 1 行 = 垫 1 的第 1 行。垫 2 的第 2 行等于第 1 行 mat1 *第 2 行 mat1。mat2 的第 3 行等于 mat1 的第 1 行 *mat1 的第 2 行,*1 的第 3 行。这个过程一直持续到第 16 行。

我需要编写一个函数来对列表中所有相同大小的矩阵进行此计算。

标签: rmatrixaccumulate

解决方案


基本上你需要的是每列的累积乘积,可以使用cumprod基础 R 中的函数应用

apply(mat1, 2, cumprod)

#        [,1]   [,2]   [,3]   [,4]
# [1,] 1.0000 1.0000 1.0000 1.0000
# [2,] 0.8793 0.9890 1.1102 0.9031
# [3,] 0.9037 0.9384 1.0574 0.8031
# [4,] 1.0017 0.8529 0.9824 0.7026
# [5,] 0.7667 0.7815 0.9332 0.6658
# [6,] 0.7996 0.9703 0.7811 0.6327
# [7,] 0.8401 0.9833 0.6899 0.5184
# [8,] 0.7918 0.9351 0.5395 0.4883
# [9,] 0.7485 0.8939 0.4672 0.4341
#[10,] 0.7063 0.9350 0.4534 0.3901
#[11,] 0.6434 0.8701 0.4323 0.3837
#[12,] 0.6127 0.7441 0.4950 0.4053
#[13,] 0.5515 0.7869 0.4421 0.4721
#[14,] 0.5087 0.7063 0.4043 0.4356
#[15,] 0.5120 0.7052 0.3929 0.5056
#[16,] 0.5611 0.6392 0.3538 0.4470

数据

set.seed(1234)
mat1 <- matrix(nrow=16, ncol =4)
mat1[1,] <- c(1,1,1,1)
mat1[2:16,] <- 1+rnorm(60,0,0.1)

推荐阅读