2013-04-15 13 views
6

Załóżmy, że ma trzy przez 5 macierz R:interpolację danych w R

4 5 5 6 8 
3 4 4 5 6 
2 3 3 3 4 

chciałbym interpolacji między tymi wartościami w celu utworzenia macierzy o rozmiarze 15 przez 25. to również tutaj określić, czy interpolacja jest liniowa, gaussowska itd. Jak mogę to zrobić?

Na przykład, jeśli mam małą matrycę jak ten

2 3 
1 3 

i chcę, aby stało się 3 na 3, to może wyglądać

2 2.5 3 
    1.5 2.2 3 
    1 2  3 
+1

Nie jest jasne, czego chcesz. Podaj przykładowe dane wyjściowe. –

+0

ten wpis może być pomocny? http://stackoverflow.com/questions/3093455/3d-geometry-how-to-interpolate-a-matrix – Arun

+0

@Arun, który wydaje się przydatny, chociaż musi być wbudowana funkcja R, aby to zrobić ... – CodeGuy

Odpowiedz

6
app <- function(x, n) approx(x, n=n)$y # Or whatever interpolation that you want 

apply(t(apply(x, 1, function(x) app(x, nc))), 2, function(x) app(x, nr)) 
    [,1] [,2] [,3] 
[1,] 2.0 2.50 3 
[2,] 1.5 2.25 3 
[3,] 1.0 2.00 3 
+0

Do uzupełnienia na moje komentarze w mojej odpowiedzi: jeśli czytam ten kod poprawnie, ustawienie 'nc' i' nr' na liczbę kolumn/wierszy, które ma dla macierzy wyjściowej, pozwoli na dowolne asymetryczne rozwinięcie. –

0

Dawno temu Napisałem podobną zabawkę, z wyjątkiem tego, że nigdy nie byłem w pobliżu, by zdefiniować funkcję interpolacji. Jest też raster::disaggregate.

zexpand<-function(inarray, fact=2, interp=FALSE, ...) { 
# do same analysis of fact to allow one or two values, fact >=1 required, etc. 
fact<-as.integer(round(fact)) 
switch(as.character(length(fact)), 
      '1' = xfact<-yfact<-fact, 
      '2'= {xfact<-fact[1]; yfact<-fact[2]}, 
      {xfact<-fact[1]; yfact<-fact[2];warning(' fact is too long. First two values used.')}) 
if (xfact < 1) { stop('fact[1] must be > 0') } 
if (yfact < 1) { stop('fact[2] must be > 0') } 
bigtmp <- matrix(rep(t(inarray), each=xfact), nrow(inarray), ncol(inarray)*xfact, byr=T) #does column expansion 
bigx <- t(matrix(rep((bigtmp),each=yfact),ncol(bigtmp),nrow(bigtmp)*yfact,byr=T)) 
# the interpolation would go here. Or use interp.loess on output (won't 
# handle complex data). Also, look at fields::Tps which probably does 
# a much better job anyway. Just do separately on Re and Im data 
return(invisible(bigx)) 
} 
+0

Dzięki za odpowiedź. Jak to jest inne lub lepsze od powyższej odpowiedzi Math Lundberga? – CodeGuy

+0

@CodeGuy Jeśli faktycznie wstawię tam funkcję interpolacji (zasadniczo zastępując funkcję 'rep', która tylko duplikuje wiersze lub kolumny), to robiłbym prawie dokładnie to samo, z tym wyjątkiem, że pozwalam na różne rozszerzenia w kolumnie i wymiary rzędu. Jak napisał Matthew, możesz zamienić dowolny interpolator w kod. –

+0

Rozumiem. Dzięki za odpowiedzi. – CodeGuy