Interpolacja nieregularnie rozłożonych danych

0

Witam.
Posiadam tablicę danych wysokościowych, które są w niej nierównomiernie rozłożone

-1 -1 5 3 -1 -1 -1 4
 2  4 -1 8 4 2 3 -1 -1
-1 0 2 0 -1 -1 -1 3

gdzie -1 oznacza brak danych.

Potrzebuję teraz zinterpolować te dane tak, aby pozbyć się "pustych" komórek.
Czytałem co nieco o metodzie Sheparda ( IDW ) czy Kriegingu, jednak szczerze przyznam, że nie wiele z tego zrozumiałem ;)

Czy byłby ktoś tak uprzejmy i polecił jakąś libkę do tego typu algorytmów oraz ewentualnie rzucił jakimś prostym przykładem?
Z góry dzięki :)

0

Czy dobrze rozumiem, że jest to jednowymiarowa tablica z kolejnymi pomiarami w stałych odstępach czasu lub w stałych odległościach w poziomie, a -1 to brak pomiaru?

Najprostszy pomysł, to wziąć istniejące wartości najbliższe szukanym danym i na podstawie danych skrajnych i odległości od szukanej proporcjonalnie obliczysz wartość.
Dla (3, -1, -1, -1, 4) będzie (3, 3.25, 3.5, 3.75, 4), dla (4, -1, 8) będzie (4, 6, 8).
Nie pamiętam wzoru, ale posługując się arkuszem kalkulacyjnym łatwo go wyprowadzisz.

Oczywiście musisz zdecydować, czy taka interpolacja jest dopuszczalna w Twoich potrzebach.
Jeżeli w danych źródłowych wokół każdego ciągu niezmierzonych wartości z obu stron są dwie zmierzone, np (2, 4, -1, 8, 4), to można spróbować znaleźć funkcję wielomianową ax3+bx2+cx+d=0, gdzie a, b, c, d będą tak dobrane, że krzywa przechodzi przez skrajne 4 punkty. Wzory, jak taką funkcję wyznaczyć znajdziesz w Internecie.

Generalnie jest to interpolacja wielomianowa, może taka wystarczy zamiast bardziej wyrafinowanych algorytmów.
https://pl.wikipedia.org/wiki/Interpolacja_wielomianowa

0
andrzejlisek napisał(a):

Czy dobrze rozumiem, że jest to jednowymiarowa tablica z kolejnymi pomiarami w stałych odstępach czasu lub w stałych odległościach w poziomie, a -1 to brak pomiaru?

Przedstawię to w profesjonalnie wykonanej graficznej formie ( czyli w paint'cie ;) )
http://s2.postimg.org/dghu9hpd5/wartosci.png

Teoretycznie jest to tablica dwuwymiarowa ( kwadrat ), ale dane trzymam w najprostszym wektorze ( x * y ).

Najprostszy pomysł, to wziąć istniejące wartości najbliższe szukanym danym i na podstawie danych skrajnych i odległości od szukanej proporcjonalnie obliczysz wartość.
Dla (3, -1, -1, -1, 4) będzie (3, 3.25, 3.5, 3.75, 4), dla (4, -1, 8) będzie (4, 6, 8).
Nie pamiętam wzoru, ale posługując się arkuszem kalkulacyjnym łatwo go wyprowadzisz.

Oczywiście musisz zdecydować, czy taka interpolacja jest dopuszczalna w Twoich potrzebach.
Jeżeli w danych źródłowych wokół każdego ciągu niezmierzonych wartości z obu stron są dwie zmierzone, np (2, 4, -1, 8, 4), to można spróbować znaleźć funkcję wielomianową ax3+bx2+cx+d=0, gdzie a, b, c, d będą tak dobrane, że krzywa przechodzi przez skrajne 4 punkty. Wzory, jak taką funkcję wyznaczyć znajdziesz w Internecie.

Generalnie jest to interpolacja wielomianowa, może taka wystarczy zamiast bardziej wyrafinowanych algorytmów.
https://pl.wikipedia.org/wiki/Interpolacja_wielomianowa

Aktualnie skłaniam się ku metodzie Inverse Distance Weighting, znalazłem nawet implementacje.

Z tego mi mój mózg podpowiada cały proces powinien wyglądać tak:
1.) wyznaczam promień ( maksymalna odległość komórek branych pod uwagę podczas wyliczania wartości )
1.) tworzę listę pustych komórek
2.) sortuje ją wg. ilości 'sąsiadów' w wyznaczonym promieniu, którzy mają znane wartości
3.) wyliczam wartość dla pierwszego elementu z listy
4.) aktualizuję listę
5.) sortuję listę
6.) jeżeli lista nie jest pusta wracam do pkt.3

1 użytkowników online, w tym zalogowanych: 0, gości: 1