Interpolacja(?) macierzy

0

Witam,

mam dane w postaci:
x,y,z,value

Załóżmy, że wczytuje dane to tablicy 3 wymiarowej:
d[1][1][1]=wartosc1
d[2][2][2]=wartosc2
d[3][3][3]=wartosc3
d[4][4][4]=wartosc4
itd.
to najprostszy przykład danych...

Jak wyznaczyć wartość w punkcie d[1][0][0] i reszcie punktów w których nie mam wartości?
Pewnie są na to jakieś algorytmy, ale nie mogę znaleźć:(

0

A jakie warunki ma spelniac ta macierz? Bo jak dowolne to losuj wartosci ;)

0

Sugeruję iteracyjnie. Dla każdej pozycji której wartosci nie znasz na wstępie wstaw value 0. Następnie przelec po wszystich d[i,j,k] i jezeli value nie było znane to policz średnią z sąsiednich pozycji. Nie przejmuj się jesli wartosci sasiednich pozycji też nie sa znane. W takim punkcie w pierwszym przebiegu operacja nie da rezultatu ale po wielu iteracjach znane wartosci value "rozpłyną się" po sąsiednich pozycjach o nie znanym value, propagując się dalej i dalej.

Tą metodą wyznacza się rozkład potencjału elektrycznego wokół elektrod o znanym napięciu.

0

Problem jest następujący:
dane pochodzą z jakichś pomiarów (np. rozkład temperatury w pomieszczeniu), te dane odpowiednio skaluję i wrzucam do tablicy (100x100x100) aby mieć łatwy dostęp
po czym rysuję przekrój np w x=1 i pojawia się problem, gdy nie mam danych dla tego przekroju a jakieś wartości tam powinny byc gdyż w każdym punkcie jest jakaś temperatura
dlatego na początku przy wczytywaniu danych chcę wypełnić moją całą macierz interpolując dla punktów gdzie nie mam wartości

Myślałem, aby dla każdego punktu którego wartości nie znam szukać najbliższych sąsiadów i potem ustalać wartość ze średnią ważoną, ale dla 100x100x100 to zbyt czasochłonne.

Nie wiem czy dobrze wyjaśniłem mój problem... oraz czy w ogóle dobrze podchodze do problemu

0

No to proponuje tak jak sugeruje jerryNaRowerze.
Z malymi uwagami:

  • nie ustawiac poczatkowo na wartosc 0 (bo temperatura tez taka moze byc), a na przyklad na null (jesli sie da) lub wartosc z zalozenia niemozliwa, np. -300 stopni (w skali Celsjusza).
  • dla przyspieszenia wpisz indeksy wartosci nieustalonych do listy i przegladaj liste usuwajac z niej elementy zaraz po ustaleniu. Algorytm puszczasz do czasu az lista bedzie pusta. Dzieki temu unikasz przegladania calej macierzy np. 1000 razy.
0

Zapodałem sobie fragment kodu który wykonał interpolację według metody "iteracyjnej sredniej" dla przypadku 2d.
Założyłem że w pokoju(?) były rozmieszczone 4 czujniki punktowe które wskazysały na przemian -100 i +100 (stopni?), ściany miały temperaturę 0.
Kryterium zakończenia interpolacji było zdefiniowane na podstawie liczby zmian przy liczeniu średniej z sęsiednich elementów macierzy. interpolacja była zakończona gdy liczba zmian większych niż zadana dokładność spadła do 0.
Czas intrpolacji zależał od przyjętej dokładności i wynosił zwykle kilkanście sekund.
Wynik interpolacji wrzuciłem na bitmapę którą zmieszczam poniżej.

mrjozo, oceń czy cię to urządza, jakby co to mogę dorzucić trochę kodu z komentarzem.

user image

0

Dla każdego punktu "niemierzonego" znajdź k (wybrać wartość 1 do powiedzmy 5) najbliższych zmierzonych punktów i policz średnią ważoną z tych zmierzonych. Wagi - odwrotności odległości albo kwadratów odległości.

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