Springen naar inhoud

array interpoleren?


  • Log in om te kunnen reageren

#1

Brownie

    Brownie


  • >250 berichten
  • 292 berichten
  • Ervaren gebruiker

Geplaatst op 02 augustus 2005 - 14:41

Stel ik heb een array van m elementen. Deze bevat functiewaarden voor een grafiek. Ik wil hem vergroten tot een array van n elementen (n>m). Het eerste en laatste element moeten hetzelfde zijn. Het tweede element moet dus een waarde hebben die tussen het eerste en tweede element van de originele array zit.
Kortom ik wil een grotere array hebben met meer functiewaarden, maar wel voor hetzelfde domein.
Hoe pak ik dit aan mbv C++ bijvoorbeeld?
"Not everything that can be counted counts, and not everything that counts can be counted." (A. Einstein)

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

NASE

    NASE


  • >250 berichten
  • 385 berichten
  • Ervaren gebruiker

Geplaatst op 02 augustus 2005 - 14:52

de eerste vraag is. Weet je welke waarden je juist wil hebben. Zijn het random waarden tussen de twee grenzen. Of het gemiddelde? Je nog iets anders, staan deze in een andere array. Moet er tussen ekle twee elementen een nieuwe waarden komen of niet...

En werk je echt met een array, of met iets anders. Als ik mij niet vergis heb je in C++ een mechanisme dat toelaat om dezelfde gegevenstypen op te slaan als een array, maar dan zonder bovenlimiet qua lente.

P.S. kan zelf wel geen c++.

#3

Brownie

    Brownie


  • >250 berichten
  • 292 berichten
  • Ervaren gebruiker

Geplaatst op 02 augustus 2005 - 15:04

de eerste vraag is.  Weet je welke waarden je juist wil hebben.  Zijn het random waarden tussen de twee grenzen.  Of het gemiddelde?  Je nog iets anders, staan deze in een andere array.  Moet er tussen ekle twee elementen een nieuwe waarden komen of niet...


De afstand dx tussen twee opeenvolgende arrayelementen is steeds gelijk, maar moet dus in de nieuwe array kleiner worden.
De eerste en laatste waarde van het array wil ik hetzelfde hebben als in het origineel. m kan voor elke som anders zijn, terwijl ik n vast op 512 zet. Indien m = 256, wil ik dus dat hij tussen elk elk paar opeenvolgende functiewaarden 1 toevoegd die het gemiddelde tussen die twee is.
Dat is een eenvoudig voorbeeld, maar hoe pak ik het in het algmeen aan? Voor m = 200 wordt het al heel wat anders.

En werk je echt met een array, of met iets anders.  Als ik mij niet vergis heb je in C++ een mechanisme dat toelaat om dezelfde gegevenstypen op  te slaan als een array, maar dan zonder bovenlimiet qua lente.

P.S. kan zelf wel geen c++.


Ik werk met een array en lengte van de array is dus geen probleem. Het gaat me erom hoe ik in algemene termen elk element van de nieuwe array berekenen met alleen het gegeven dat m<n.
Ik gebruik C++, maar in een andere taal zal het weinig verschil maken lijkt me.
"Not everything that can be counted counts, and not everything that counts can be counted." (A. Einstein)

#4

Chris777

    Chris777


  • >25 berichten
  • 32 berichten
  • Gebruiker

Geplaatst op 02 augustus 2005 - 19:55

Lijkt me dat je met een dynamische array moet werken. In de trand van;

typedef struct str_x *x;
struct str_x{
long int subsample;
x next;
};

// free allocated mem
if(dTpl->x != NULL) realloc(dTpl->x, 0);


x bi; // allocate mem for list to store bounds
bi = (x)calloc(1, sizeof(struct str_x));
dTpl->x = bi; // store start adress, NULL on failure
for (index = 1; index < i; index++) {
if((bi->next = (x)calloc(1, sizeof(struct str_x))) == NULL) {
dTpl->x = NULL; // store NULL on failure
}
bi = bi->next;
bi->next = NULL; // store NULL on end of list
}


Deze kan je dus met een structure verlengen of evt datatussenvoegen
boem is stoppen... plons is water...

#5

Chriis

    Chriis


  • >250 berichten
  • 664 berichten
  • Ervaren gebruiker

Geplaatst op 02 augustus 2005 - 20:59

Er zijn vele methoden, het is afhankelijk van hoe exact je de resultaten wilt.
Maar hier is er één, A is de korte en B de lange array:

1. Maak de lange array door de elementen uit de korte te herhalen.

2. Filter de lange array met een 'lowpass filter',
dat betekent:
maak een kopie van B->C
vervang iedere B[i] = c[0]*C[i-1] + c[1]*C[i] +c[2]*C[i+1];

met c is b.v. : {1/3,1/3,1/3} of {1/4,1/2,1/4} of {1/12,1/6,1/2,1/6,1/12},
op internet kun je wel andere filter coefficienten vinden.

De lengte van de filter is afhankelijk van de schaling, deste groter deste langer c moet zijn.

#6

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 02 augustus 2005 - 22:30

Stel ik heb een array van m elementen. Deze bevat functiewaarden voor een grafiek. Ik wil hem vergroten tot een array van n elementen (n>m). Het eerste en laatste element moeten hetzelfde zijn. Het tweede element moet dus een waarde hebben die tussen het eerste en tweede element van de originele array zit.
Kortom ik wil een grotere array hebben met meer functiewaarden, maar wel voor hetzelfde domein.
Hoe pak ik dit aan mbv C++ bijvoorbeeld?

Waar het op neer komt is een continue functie te maken op basis van je m elementen. Dat is een array die je kunt uitlezen op integer indices, dus array[0] t/m array[m-1], de functie die je erbij moet construeren is een functie waar iets zinnigs uitkomt voor iedere (floating point) waarde tussen 0 en m-1, en liefst zodat f(t) = array[t] als t een geheel getal (int) is.
Dus bijvoorbeeld f(0) = array[0], f(1) = array[1], en f(0.5) = iets daar tussenin.

Om er vervolgens een array van n elementen van te maken, gebruik je de functie voor oplopende t van 0 t/m m-1 in n stappen.

De simpelste methode is lineaire interpolatie:
float interpoleer( float t, float *array, int m )

{

	int i = int(t);	

	float f = t-i;

	if (t<0.0) { i = 0; f = 0.0; }

	if (i>=m) { i = m-1; f = 0.0; }

	int j = i+1;

	if (j>=m) j = m-1;

	return f*array[j] + (1.0-f)*array[i];  

}
Om nu je nieuwe array van n elementen te vullen doe je dit:
for (int i=0; i<n; i++)

{

	float t = float(i*(m-1))/(n-1);

	array2[i] = interpoleer(t,array,m);

}
Bovenstaand voorbeeld heet lineaire interpolatie omdat je lineair (met een rechte lijn) tussen 2 opeenvolgende punten interpoleert. Je kunt hier ook andere methoden voor gebruiken, dan krijg je ingewikkeldere "interpoleer" functies. Cubic interpolatie bijvoorbeeld, die gebruikt een andere formule en werkt met vier punten uit de originele array i.p.v. twee.
In theory, there's no difference between theory and practice. In practice, there is.

#7

Brownie

    Brownie


  • >250 berichten
  • 292 berichten
  • Ervaren gebruiker

Geplaatst op 03 augustus 2005 - 08:56

Bedankt Rogier,

Ik geloof dat deze code inderdaad doet wat ik wil.
Lineaire interpolatie voldoet in mijn geval prima in elk geval.
Ik geloof dat hier dus wel C++ kenners aanwezig zijn. Daarom nog een paar vraagjes over Visual C++:

Nu ik de het inerpoleren van mijn data heb toegevoegd, compileert het programma nog wel en start het ook op. Echter als ik een berekening uitvoer krijg ik voor alle invoer de volgende melding:
'The instruction at "0x00409eae" referenced memory at "0x38b33778". The memory could not be "read".'
Deze melding kreeg ik eerder ook al bij bepaalde invoergetallen, maar nu doet hij het altijd en geeft dus geen resultaat. Waar moet ik zoeken om dit probleem op te lossen?

Als ik in mijn code een string zoek, mbv find (Ctrl-f), kan ik kiezen voor 'mark all'. Dan verschijnt er een blauw blokje in de kantlijn. Maar doe ik dat nog een keer voor een ander woord, dan blijven die oude blokjes ook staan. Weet iemand hoe ik die weer weg kan krijgen?

Als ik Debug functies probeer te gebruiken verteld Visual C++ me dat ik niet bij de 'debuggers users group' hoor. Op internet heb ik gevonden dat ik dat kan wijzigen door vanaf mijn start menu te kiezen settings->control panel->administrative tools. Hier zou een menu moeten staan om dat te veranderen, maar bij mij is dat scherm helemaal leeg. Hoe los ik dit op? Ik gebruik deze computer pas sinds kort, maar voor mij zat hier iemand anders die ook Visual C++ gebruikte. Ik weet echter niet of hij de debugfuncties ook gebruikte.
"Not everything that can be counted counts, and not everything that counts can be counted." (A. Einstein)





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures