Rog*_*oJB 6 arrays r matrix linear-algebra
我有这个数组:
T <- array(c(.25,.1,.1,.1,.05,.1,.1,.2),c(2,2,2))
# , , 1
# [,1] [,2]
# [1,] 0.25 0.1
# [2,] 0.10 0.1
# , , 2
# [,1] [,2]
# [1,] 0.05 0.1
# [2,] 0.10 0.2
Run Code Online (Sandbox Code Playgroud)
我想它可以被理解为一种横跨第三维切成的"立方体".它有行(维度1),列(暗淡2)和"高度"(暗淡3),可以这么说......
现在,我可以在其中一个维度上对其值进行求和.有3种可能的组合:
Tm1 <- apply(T0,c(1,2),sum)
Tm2 <- apply(T0,c(1,3),sum)
Tm3 <- apply(T0,c(2,3),sum)
Run Code Online (Sandbox Code Playgroud)
现在我有这个:
#> Tm1
# [,1] [,2]
#[1,] 0.3 0.2
#[2,] 0.2 0.3
#> Tm2
# [,1] [,2]
#[1,] 0.35 0.15
#[2,] 0.20 0.30
#> Tm3
# [,1] [,2]
#[1,] 0.35 0.15
#[2,] 0.20 0.30
Run Code Online (Sandbox Code Playgroud)
它们是立方体"面孔".
是否有可能从这3个矩阵中恢复原始数组?.换句话说,只要通过查看它的"面孔",是否有可能知道这个"立方体"内部的分布?
如果是这样,怎么办?(我的意思是,"代数方式"和R算法......)
这就是我如何想出解决你的问题的方法。首先,构建方程组,使得A %*% x = b(其中x是要求解的值,位于 内T0):
n <- prod(dim(T0))
b <- c(Tm1, Tm2, Tm3)
m <- length(b)
Ti <- array(seq_along(T0), dim(T0))
Ti1 <- unlist(apply(Ti, c(1,2), list))
Ti2 <- unlist(apply(Ti, c(1,3), list))
Ti3 <- unlist(apply(Ti, c(2,3), list))
A <- matrix(0, nrow = m, ncol = n)
A[cbind(rep(1:m, each = 2), c(Ti1, Ti2, Ti3))] <- 1
cbind(A, b)
# b
# [1,] 1 0 0 0 1 0 0 0 0.30
# [2,] 0 1 0 0 0 1 0 0 0.20
# [3,] 0 0 1 0 0 0 1 0 0.20
# [4,] 0 0 0 1 0 0 0 1 0.30
# [5,] 1 0 1 0 0 0 0 0 0.35
# [6,] 0 1 0 1 0 0 0 0 0.20
# [7,] 0 0 0 0 1 0 1 0 0.15
# [8,] 0 0 0 0 0 1 0 1 0.30
# [9,] 1 1 0 0 0 0 0 0 0.35
# [10,] 0 0 1 1 0 0 0 0 0.20
# [11,] 0 0 0 0 1 1 0 0 0.15
# [12,] 0 0 0 0 0 0 1 1 0.30
Run Code Online (Sandbox Code Playgroud)
A是一个非方阵,所以我使用广义逆来求解x:
library(MASS)
xsol <- ginv(A) %*% b
Tsol <- array(xsol, dim(T0))
Tsol
# , , 1
#
# [,1] [,2]
# [1,] 0.2375 0.1125
# [2,] 0.1125 0.0875
#
# , , 2
#
# [,1] [,2]
# [1,] 0.0625 0.0875
# [2,] 0.0875 0.2125
Run Code Online (Sandbox Code Playgroud)
该解决方案与您的初始 T0 不匹配,但是您可以检查
apply(Tsol, c(1,2), sum)
# [,1] [,2]
# [1,] 0.3 0.2
# [2,] 0.2 0.3
apply(Tsol, c(1,3), sum)
# [,1] [,2]
# [1,] 0.35 0.15
# [2,] 0.20 0.30
apply(Tsol, c(2,3), sum)
# [,1] [,2]
# [1,] 0.35 0.15
# [2,] 0.20 0.30
Run Code Online (Sandbox Code Playgroud)
结论?不,不可能恢复原始矩阵。另一种显示方法是矩阵qr(A)$rank的秩A为7,而您有8未知数。因此,您需要一点额外的信息,例如T[1, 1]恢复0.25原始数组:
A <- rbind(A, c(1, rep(0, n - 1)))
b <- c(b, 0.25)
qr(A)$rank
# [1] 8
xsol <- ginv(A) %*% b
Tsol <- array(xsol, dim(T0))
Tsol
# , , 1
# [,1] [,2]
# [1,] 0.25 0.1
# [2,] 0.10 0.1
# , , 2
# [,1] [,2]
# [1,] 0.05 0.1
# [2,] 0.10 0.2
Run Code Online (Sandbox Code Playgroud)