r - 循环对角乘法 - 7 * 7 矩阵...等等

标签 r matrix matrix-multiplication

我需要对下表进行对角乘法。

这是一个 7*7 矩阵:

  • 第1步:需要对7*7矩阵进行对角乘法,
  • 第 2 步:然后忽略第一列并选择接下来的 7 列和 7 行并进行对角乘法。
  • 第 3 步:忽略第一列和第二列,选择接下来的 7 列和 7 行并进行对角乘法。
  • 第 4 步:与第 3 步类似,递增列,忽略 1,2,3 .... 依此类推,到目前为止 ....

注意:对角线将从右下角直接向上延伸到左上侧。

数据:

28/02/2013  31/03/2013  30/04/2013  31/05/2013  30/06/2013  31/07/2013  31/08/2013  30/09/2013  31/10/2013  30/11/2013  31/12/2013  31/01/2014  28/02/2014
0.04        0.03        0.03        0.04        0.04        0.07        0.86        0.28            0.05        0.05        0.05        0.04        0.04
0.44        0.44        0.42        0.43        0.40        0.32        0.64        0.02        0.33        0.36        0.30        0.27        0.37
0.57        0.57        0.52        0.59        0.62        0.51        0.79        0.23        0.64        0.66        0.50        0.55        0.60
0.61        0.58        0.60        0.63        0.65        0.59        0.81        0.83        1.00        0.63        0.57        0.63        0.74
0.70        0.65        0.66        0.71        0.73        0.66        0.86        0.90        0.55        0.76        0.65        0.66        0.74
0.76        0.76        0.79        0.74        0.83        0.83        0.86        1.00        0.61        0.83        0.38        0.74        0.75
0.80        0.84        0.89        0.84        0.82        0.83        0.98        0.84        0.44        0.93        0.88        0.78        0.78

将每一列视为 A、B、C、D、E、F、G、H、I、J、K 等...将会有很多列,但行数只有 7。

7*7 对角矩阵的计算如下。

A is result for -> STEP 1, B -> STEP 2 AND  C -> STEP 3 ... and so on.  

A                               B                                   C
G8*F7*E6*D5*C4*B3*A2  = 0.00    H8*G7*F6*E5*D4*C3*B2 = 0.02     I8*H7*G6*F5*E4*D3*C2 = 0.00
G8*F7*E6*D5*C4*B3  = 0.08       H8*G7*F6*E5*D4*C3 = 0.08        I8*H7*G6*F5*E4*D3 = 0.06
G8*F7*E6*D5*C4 = 0.19           H8*G7*F6*E5*D4 = 0.18           I8*H7*G6*F5*E4 = 0.14
G8*F7*E6*D5 = 0.37              H8*G7*F6*E5 = 0.31              I8*H7*G6*F5 = 0.22
G8*F8*E6 = 0.59                 H8*G7*F6 = 0.47                 I8*H7*G6 = 0.38
G8*F8 = 0.81                    H8*G7 = 0.72                    I8*H7 = 0.44
G8 = 0.98                       H8 = 0.84                       I8 = 0.44

所以结果应该打印为。

A         B     C
0       0.02    0.00
0.08    0.08    0.06
0.19    0.18    0.14
0.37    0.31    0.22
0.59    0.47    0.38
0.81    0.72    0.44
0.98    0.84    0.44

类似地,也会有 D、E、F 等结果。

请帮忙,提前致谢。

最佳答案

sapply(lapply(7:NCOL(df), function(i)
    df[, (i-6):i]), function(a)
        round(x = rev(cumprod(rev(diag(as.matrix(a))))), digits = 2))
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00
#[2,] 0.09 0.08 0.06 0.08 0.08 0.03 0.00
#[3,] 0.19 0.18 0.14 0.21 0.26 0.05 0.15
#[4,] 0.37 0.31 0.22 0.41 0.33 0.23 0.24
#[5,] 0.59 0.48 0.38 0.51 0.40 0.23 0.38
#[6,] 0.81 0.72 0.44 0.57 0.73 0.30 0.58
#[7,] 0.98 0.84 0.44 0.93 0.88 0.78 0.78

让我知道输出是否正确

数据

df = structure(list(A = c(0.04, 0.44, 0.57, 0.61, 0.7, 0.76, 0.8), 
    B = c(0.03, 0.44, 0.57, 0.58, 0.65, 0.76, 0.84), C = c(0.03, 
    0.42, 0.52, 0.6, 0.66, 0.79, 0.89), D = c(0.04, 0.43, 0.59, 
    0.63, 0.71, 0.74, 0.84), E = c(0.04, 0.4, 0.62, 0.65, 0.73, 
    0.83, 0.82), F = c(0.07, 0.32, 0.51, 0.59, 0.66, 0.83, 0.83
    ), G = c(0.86, 0.64, 0.79, 0.81, 0.86, 0.86, 0.98), H = c(0.28, 
    0.02, 0.23, 0.83, 0.9, 1, 0.84), I = c(0.05, 0.33, 0.64, 
    1, 0.55, 0.61, 0.44), J = c(0.05, 0.36, 0.66, 0.63, 0.76, 
    0.83, 0.93), K = c(0.05, 0.3, 0.5, 0.57, 0.65, 0.38, 0.88
    ), L = c(0.04, 0.27, 0.55, 0.63, 0.66, 0.74, 0.78), M = c(0.04, 
    0.37, 0.6, 0.74, 0.74, 0.75, 0.78)), .Names = c("A", "B", 
"C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"), class = "data.frame", row.names = c(NA, 
-7L))

关于r - 循环对角乘法 - 7 * 7 矩阵...等等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038907/

相关文章:

r - 如何创建POSIXct矩阵

R - 将 df 或矩阵的每一行与一个向量相乘

c - AVX2 稀疏矩阵乘法

r - 在 ggplot2 中围绕 `geom_line` 创建边框

r - R Markdown/Bookdown中的水平尺导致错误

重新格式化数值而不强制转换为字符

r - 将图另存为pdf,并同时在窗口(x11)中显示

c - C中的矩阵乘法总是返回0?

matlab - 大矩阵和稀疏矩阵乘法

javascript - 具有多线程的 Node.js 中的矩阵乘法?