2014-11-23 27 views
6

mam tej tablicy:Jak "odzyskać" 3-wymiarowych (2 x 2 x 2) array (sześcian) z 3 dwie macierze wymiarowych (twarze kostki)

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 

Przypuszczam, że to możliwe należy rozumieć jako rodzaj "sześcianu" pokrojonego w trzeci wymiar. Ma wiersze (wymiar 1), kolumny (dim 2) i "wysokość" (dim 3), że tak powiem ...

Teraz mogę zsumować jego wartości w jednym z tych wymiarów. Są 3 możliwe kombinacje:

Tm1 <- apply(T0,c(1,2),sum) 
    Tm2 <- apply(T0,c(1,3),sum) 
    Tm3 <- apply(T0,c(2,3),sum) 

Teraz mam to:

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

Są kostka "twarze".

Czy można odzyskać oryginalną tablicę z tych 3 macierzy?. Innymi słowy, czy możliwe jest poznanie rozkładu wewnątrz tego "sześcianu" po prostu patrząc na jego "twarze"?

Jeśli tak, jak to zrobić? (Mam na myśli "sposób algebry" i algorytm R ...)

+0

Jest to bardzo podobne do problemu wnioskowania ekologicznego. –

Odpowiedz

4

Oto jak wymyśliłem rozwiązanie twojego pytania. Po pierwsze, w budowie układ równań, tak że A %*% x = b (gdzie x są wartości do rozwiązania dla tych, wewnątrz 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 niepodlegającą kwadratowych macierzy więc stosować uogólniony odwrócony, aby obliczyć 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 

To rozwiązanie nie odpowiada początkowej T0, jednak można sprawdzić, że

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 

Wniosek? Nie, nie można odzyskać oryginalnej matrycy. Innym sposobem, aby to pokazać, jest to, że ranga qr(A)$rank matrycy A jest 7, a Ty masz 8 niewiadomych. Potrzebowałbyś więc jeszcze jednej odrobiny informacji, np. że T[1, 1] jest 0.25 odzyskać oryginalną tablicę:

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

Oto algebraiczne wytłumaczenie w bardziej ogólnym przypadku ze zmienną ciągłą. To może pomóc w znalezieniu przyczyny, dla której nie możesz tego zrobić. Problem polega na tym, że nie można zbudować mapy odwrotnej. Poniżej możesz podstawić znak integracji sumując, spróbuj znaleźć odwróconą macierz, a osiągną wynik pokazany powyżej flodelu. Załóżmy więc, że f jest całkowalne w domenie x, yi z. Pierwotny tabela

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

transformację jest

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

Chcesz mieć odwrotną mapę od t (x) do w.Ta mapa to:

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

Oznacza to, że po zintegrowaniu z x, nie można odzyskać go z g (y, z).

+0

Mam to ... Informacja o X już nie istnieje, więc pochodna nie odwróci tego, co zostało zrobione przez całkę. Ale myślałem o czymś innym: Jeśli utworzysz 3 nowe funkcje - każda z nich poprzez integrację w odniesieniu do jednej zmiennej naraz ... Będziesz miał 3 "częściowe informacje" na oryginalnej funkcji (nie tylko jednej , jak w twoim przykładzie). Zastanawiałem się, czy jakaś kombinacja tych nowych funkcji pozwoliłaby odwrócić ten proces ... Ale powyższa odpowiedź sugerowała, że ​​nie jest to możliwe. Logika jest podobna do tej z twojej odpowiedzi. – RogerioJB