Arrays 如何";“恢复”;由3个二维矩阵(立方体面)组成的3维(2x2x2)数组(立方体)

Arrays 如何";“恢复”;由3个二维矩阵(立方体面)组成的3维(2x2x2)数组(立方体),arrays,r,matrix,linear-algebra,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 它们是立方体的“面” 是否可以从这3个矩阵中恢复原始阵列?。换句

我有这个阵列:

    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
它们是立方体的“面”

是否可以从这3个矩阵中恢复原始阵列?。换句话说,仅仅通过观察“面”就可以知道“立方体”内部的分布情况吗


如果是,怎么做?(我的意思是,“代数方法”和R算法…

下面是我如何为你的问题找到解决方案的。首先,建立方程组,使
A%*%x=b
(其中
x
是要求解的值,在
T0
中):

此解决方案与初始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)$rank
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

A这里是一个关于连续变量的更一般情况的代数解释。这可能有助于找到你不能这么做的根本原因。问题是你不能构造逆映射。下面,你可以用求和来代替积分符号,试着找到逆矩阵,它们就得到了上面弗洛德尔所展示的结果。假设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\u x f(x,y,z)dx\right)=\frac{\partial}{\partial x}g(y,z)=0$$


也就是说,一旦你将x积分,你就无法从g(y,z)中恢复它。

这非常类似于生态推理问题。我得到了。。。关于x的信息已经不存在了,所以导数不会逆转积分的作用。但我在想另一件事:如果你创建了3个新函数——每一个都是通过一次对一个变量进行积分来实现的。。。在原始函数上有3条“部分信息”(而不是像您的示例中那样只有一条)。我想知道这些新功能的某种组合是否会允许逆转这个过程。。。但是上面的答案表明这也是不可能的。逻辑与你的答案相似。
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
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
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 <- 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