Har ett litet problem här, hoppas någon orkar läsa igenom och dessutom vet om något bra svar... Inga svar... men är det verkligen ett så svårt/ovanligt problem? Hej Niklas! Njae... jag har en vektor A, som jag kan skala och förkjuta godtyckligt till en annan vektor A'.Tips på rimlig algoritm?
Fysiken spelar egentligen ingen roll, men jag kan förklara lite snabbt; jag har tagit fram ett Jod-spektrum (laser genom jod i gasform), genom att använda en spektrometer, tagit ut två filer (en på 800 mätpunkter och en på 1200 mätpunkter).
Laserljuset har en våglängd på 612 nm, och jag får alltså bara ut våglängder över detta.
Jag har sedan dragit in allt i matlab, skrivit ett litet program som tar ut alla topparna och deras relativa intensiteter.
Hur som helst... nu är det så att jag alltså har en lista med mätpunkter som innehåller toppar. Varje mätpunkt motsvarar naturligtvis en viss våglängd, och hade det inte blivit tidskris så hade jag naturligtvis kommit ihåg eller skrivit upp vilka våglängder de motsvarade. Men nu har jag inte det. Min lista med numeriska värden skall alltså skalas och förskjutas på lämpligt vis.
Sen har jag genom viss försnyltning kommit åt en lista med jods spektrallinjer på nätet - både våglängd och intensitet, men med mycket större intervall på våglängder än jag har. Jag har alltså två stycken listor, den ena med godtyckliga värden, men sannolikt rätt relativa avstånd, som motsvarar en liten del av den stora. Finns det något vettigt sätt att matcha dem mot varandra?
Jag kan tänka mig någon form av minstakvadratmetod, men har svårt att se hur det skulle funka...
Jag kan alltså inte se direkt på intensiteterna hur det bör ligga, och göra det manuellt.
PS
Jag har under detta skrivande kommit på att jag kanske har lyckats ladda ner spektrallinjerna för rent metalliskt jod snarare än jod i gasform. Ska kolla vidare på det, men jag är osäker på hur jag bör göra...Sv: Tips på rimlig algoritm?
Alltså:
1. Jag har en vektor med tal
[10, 20, 50, 90, 130]
2. Jag har en annan vektor med tal
[10, 30, 100, 170, 400, 450, 800, 1200, 3700]
3. Den första kan jag skala med ett tal a (>0), och förskjuta med ett tal b (>0), dvs omvandla till:
[10a + b, 20a + b, 50a + b, 90a + b, 130a + b]
4. Jag vill nu matcha den skalade så bra som möjligt mot den första. Det första talet i den första vektorn ska matchas mot ett godtyckligt valt element i den andra. Hur kan man göra det "bäst" (rimligen minstakvadrat i något avseende)?
och eventuellt:
5. Den första kan ha värden som inte ska finnas med, och sakna värden som borde finnas med. Göra en anpassning även i detta fallet.
Man kan ju tänka sig någon variant med att generera alla lösningar och köra lite backtracking tillsammans med en "fitness"-funktion, eller möjligtvis ett NN, men man tycker väl ändå att problemet bör ha uppstått tidigare och fått en hyfast "matematisk" lösning?Sv:Tips på rimlig algoritm?
Får se om jag fattat rätt.
Du söker det värde i den första vektorn som skall vara så nära (eller exakt lika) som möjligt,
det värde du hämtat i den sk. skalade vektorn?
//HåkanSv: Tips på rimlig algoritm?
Jag har utöver det en vektor B, väsentligt mycket större (fler element) än A och A'.
A' skall nu "passas in", så att så många av A's element är så nära några av Bs element som möjligt (och man bör inte hoppa över allt för många av dem, dvs gärna hålla skalningen hyfsat liten).
Jag tycker bara att det borde finnas en standardalgoritm för grejen...
(Och nu börjar jag nog mer och mer komma på hur man bör göra... definiera en fitnessfunktion där man räknar avståndet till närmsta grannen i kvadrat, tar summan av det och kör roten ur, det är väl nästan en diskret minstakvadratlösning...)