Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

1&2-D lineaire data interpolatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dames en Heren,

Ik moet een 1D en een 2D lineaire data interpolatie doen, heeft iemand een idee in welke programmeer taal dit mogelijk is gewoon met behulp van een module? Het is mogelijk in MATLAB via interp1 & interp2 maar ik kan dat hier niet gebruiken vanwege afwezigheid van een license... Is het bijvoorbeeld mogelijk in PERL, PYTHON, of FORTRAN 77/90? Ik word namelijk een beetje scheel van het google'n tussen alle verschillende modules en functies.

Groetjes,

Peerke

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik snap er niets van, wat wil je eigenlijk interpoleren? Dat komt toch gewoon simpelweg neer op A + t*(B-A), waarbij A je source is, B je destination en t een waarde tussen 0 en 1.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 27-10 15:31
.oisyn heeft helemaal gelijk :)

Als je geen Matlab licentie hebt kan je natuurlijk ook de Opensource variant: Scilab gebruiken ...

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Verwijderd

Topicstarter
1d interpolatie werkt inderdaad zo, maar voor grote (x,y) arrays is het niet zo simpel zoals je het zegt. De correctie manier om het te formuleren is de waarde y die je zoekt voor een punt x tussen twee bekende waarde x1,x2 is: y=y1+(y2-y1)/(x2-x1)*(x-x1) Daarnaast ik nog de 2D lineaire data interpolatie en dus voor (x,y,z) arrays, met een loop over een van deze variabelen. Maar ik ga is een kijkje nemen in een numeriek analyse book :(

Verwijderd

Topicstarter
Sorry het is bekende waarde (x1,y1) & (x2,y2) :D

  • ATS
  • Registratie: September 2001
  • Laatst online: 28-11 20:56

ATS

Je kan zoiets in elke willekeurige programmeertaal doen. Het gaat alleen om het algoritme wat je gebruikt. Kijk eens op wikipedia ofzo naar bilinear en bicubic interpolation. Er zijn natuurlijk meer methoden om dat te doen, maar het is een goede start start.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Topicstarter
Ja dit is dus ook mijn vraag: Weet iemand of er modules zijn voor, vooral voor de 2d lineaire interpolatie, voor bijvoorbeel python/c++/fortran. Dit zodat ik niet meer tijd kwijt ben in het programmeren van de interpolatie dan het programma zelf.

  • mace
  • Registratie: Juni 2003
  • Laatst online: 30-11 22:53

mace

Sapere Aude

Is dit iets?

http://www.johnny-lin.com/py_pkgs/gemath/doc/
edit:
en dan vooral: http://www.johnny-lin.com...h/doc/interp.html#-interp

[ Voor 41% gewijzigd door mace op 03-09-2007 10:18 ]


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op maandag 03 september 2007 @ 09:27:
1d interpolatie werkt inderdaad zo, maar voor grote (x,y) arrays is het niet zo simpel zoals je het zegt.
Jawel hoor, net zo simpel. Eerst interpoleren in de ene richting, dan in de andere. En als je dat in een keer uitschrijft, dan kom je idd op de vergelijking die jij geeft, maar dat wil niet meteen zeggen dat het ingewikkeld is:

Als tn de t per richting is, En waarde(x,y) de waarde op plek (x,y), dan:
w1 = waarde(x1,y1) + tx * (waarde(x2,y1) - waarde(x1,y1))
w2 = waarde(x1,y2) + tx * (waarde(x2,y2) - waarde(x1,y2))
w = w1 + ty * (w2 - w1)

En dit kun je dus zo doorwerken tot N dimensies.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
float fetch1D(const std::vector<float> & dataslice, const int * coords1, const int * coords2, const float * t)
{
    int x1 = coords1[0];
    int y1 = coords2[0];
    return dataslice[x1] + t[0] * (dataslice[x2] - dataslice[x1]);
}

float fetch2D(const std::vector<std::vector<float> > & dataslice, const int * coords1, const int * coords2, const float * t)
{
    int y1 = coords1[1];
    int y2 = coords1[1];

    float a = fetch1D(dataslice[y1], coords1, coords2, t);
    float b = fetch1D(dataslice[y2], coords1, coords2, t);
    return a + t[1] * (b - a);
}

float fetch3D(const std::vector<std::vector<std::vector<float> > > & dataslice, const int * coords1, const int * coords2, const float * t)
{
    int z1 = coords1[2];
    int z2 = coords1[2];

    float a = fetch2D(dataslice[z1], coords1, coords2, t);
    float b = fetch2D(dataslice[z2], coords1, coords2, t);
    return a + t[1] * (b - a);
}

[ Voor 44% gewijzigd door .oisyn op 03-09-2007 11:41 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Als je de formule kent, waarom moet je dan nog een module maken zoeken? 't zoeken ernaar kost je probably meer tijd dan een eigen implementatie.

[ Voor 4% gewijzigd door voodooless op 03-09-2007 12:20 ]

Do diamonds shine on the dark side of the moon :?

Pagina: 1