如何从3个二维矩阵(立方体面)中"恢复"3维(2 x 2 x 2)阵列(立方体)

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算法......)

flo*_*del 4

这就是我如何想出解决你的问题的方法。首先,构建方程组,使得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的秩A7,而您有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)