2014-11-23 26 views
6

我有此數組「恢復」的3維(2×2×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 

我想這可以被理解爲一種跨立體的「立方體」。它有行(維度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算法...)

+0

這與生態推理問題非常相似。 – 2014-11-24 01:49:15

回答

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 

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 
1

以下是在具有連續可變的更一般的情況下的代數解釋。這可能有助於找出你無法做到的根本原因。問題是你不能構造逆映射。在下面,你可以用積分替代積分符號,試着找到逆矩陣,並且它們達到上面顯示的flodel的結果。所以,假設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) (y,z)= 0 $$

也就是說,一旦你集成了x,你不能從g(y, Z)。

+0

我知道了......關於x的信息不再存在,所以衍生物不會逆轉積分所做的事情。但是我在考慮其他的事情:如果你創建了3個新的函數 - 每個函數通過一次集成一個變量來實現......你將在原始函數中有3個「部分信息」(而不僅僅是一個,如你的例子)。我想知道這些新功能的組合是否能夠扭轉這一過程......但是上面的答案表明它也是不可能的。這個邏輯與你的答案類似。 – RogerioJB 2014-11-24 11:06:15