【问题标题】:How to "recover" a 3-dimensional (2 x 2 x 2) array (a cube) from 3 two dimensional matrices (the cube faces)如何从 3 个二维矩阵(立方体面)中“恢复”一个 3 维(2 x 2 x 2)数组(立方体)
【发布时间】:2014-11-23 23:52:45
【问题描述】:

我有这个数组:

    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

我想它可以理解为一种横穿第三维的“立方体”。它有行(维度 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)

现在我有了这个:

    #> 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

它们是立方体的“面孔”。

是否可以从这 3 个矩阵中恢复原始数组? .换句话说,仅仅看它的“面”就可以知道这个“立方体”内部的分布吗?

如果是这样,该怎么做? (我的意思是,“代数方式”和 R 算法......)

【问题讨论】:

  • 这非常类似于生态推理问题。

标签: arrays r matrix linear-algebra


【解决方案1】:

以下是我为您的问题想出解决方案的方法。首先,构建方程组,使得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

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

此解决方案与您的初始 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

结论?不,不可能恢复您的原始矩阵。另一种显示方式是A 矩阵的秩qr(A)$rank7,而您有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

【讨论】:

    【解决方案2】:

    这是一个更一般的连续变量情况下的代数解释。这可能有助于了解您不能这样做的根本原因。问题是您无法构建逆映射。下面,你可以用求和来代替积分符号,试着找到逆矩阵,它们就达到了上面 florel 所示的结果。因此,假设 f 在 x、y 和 z 的域中是可积的。你原来的表是

    $$ w = f(x,y,z) $$

    你的转变是

    $$t(x) = \int_x f(x,y,z)dx = g(y,z)$$

    你想要一个从 t(x) 到 w 的逆映射。这张地图是

    $$\frac{\partial t(x)}{\partial x} = \frac{\partial}{\partial x}\left(\int_x f(x,y,z)dx\right) = \frac{\partial}{\partial x}g(y,z) = 0$$

    也就是说,一旦你整合了 x,你就无法从 g(y,z) 中恢复它。

    【讨论】:

    • 我明白了...关于 x 的信息不再存在,因此导数不会反转积分所做的事情。但我在考虑另一件事:如果你创建 3 个新函数——每个函数都通过一次对一个变量进行积分......你将在原始函数上有 3 个“部分信息”(不仅仅是一个,如您的示例中所示)。我想知道这些新功能的某种组合是否可以扭转这个过程......但上面的答案表明这也是不可能的。并且逻辑与您的答案相似。
    猜你喜欢
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2021-12-01
    • 1970-01-01
    • 2018-01-07
    • 2014-05-18
    相关资源
    最近更新 更多