Fraggie
Legacy Member
Beste,
Ik ben bezig met een MATLAB implementatie van variant van het Dijkstra algoritm of korte afstand algoritme. Dit algoritme werkt goed op onze test data, maar duurt eeuwen op echte data.
Bij deze moet ik de code optimaliseren, maar mijn MATLAB kennis is daarvoor te beperkt.
Het idee in het kort:
- van x vectoren in y dimensies moet ik alle afstanden kennen tussen alle vectoren.
- gezien x en y variabel zijn, werk ik met cellen {} van array's []
- de data op zich zijn objecten in MATLAB (eigen klassen)
Wat heb ik al gedaan:
- gezien x en y @ runtime gekend zijn, maak ik een variabel van {x} cellen waarbij elke cel [y] lege objecten vast houdt -> preallocation done
- de objecten werken met een handle, dus er moet niet constant een object gekopieerd worden naar zichzelf. Dus bv: mySet = mySet.sortOnDistance() moet niet meer. Ik kan direct: mySet.sortOnDistance() werken -> heel ruw: pass by ref waar mogelijk
- minder wiskundige bewerkingen, een benadering om een beslissing te maken is even goed (zoals c² = a² + b² ipv c = (a² + b²)^.5)
Zo ben ik al van 61uur reken werk naar 4uur rekenwerk kunnen gaan voor 1000 vectoren in 9D. Maar veel meer kan ik niet bedenken. Via veel testen heb ik kunnen achterhalen dat het aanmaken en werken met cellen, langer duurt dan het uitrekenen van afstanden.
tl;dr
Bijgevolg mijn vragen:
- bestaat er een datastructuur die het gedrag van cellen heeft? Dus SNEL dynamisch de variable uitbreiden met nieuwe objecten die in GROEP bij elkaar staan (dus geen array..).
- bestaat pass by reference? Het lijkt me dat matlab altijd een referentie geeft, indien de data gewijzigd wordt in een functie. Maar altijd een copy indien de data niet wijzig?
Ik ben bezig met een MATLAB implementatie van variant van het Dijkstra algoritm of korte afstand algoritme. Dit algoritme werkt goed op onze test data, maar duurt eeuwen op echte data.
Bij deze moet ik de code optimaliseren, maar mijn MATLAB kennis is daarvoor te beperkt.
Het idee in het kort:
- van x vectoren in y dimensies moet ik alle afstanden kennen tussen alle vectoren.
- gezien x en y variabel zijn, werk ik met cellen {} van array's []
- de data op zich zijn objecten in MATLAB (eigen klassen)
Wat heb ik al gedaan:
- gezien x en y @ runtime gekend zijn, maak ik een variabel van {x} cellen waarbij elke cel [y] lege objecten vast houdt -> preallocation done
- de objecten werken met een handle, dus er moet niet constant een object gekopieerd worden naar zichzelf. Dus bv: mySet = mySet.sortOnDistance() moet niet meer. Ik kan direct: mySet.sortOnDistance() werken -> heel ruw: pass by ref waar mogelijk
- minder wiskundige bewerkingen, een benadering om een beslissing te maken is even goed (zoals c² = a² + b² ipv c = (a² + b²)^.5)
Zo ben ik al van 61uur reken werk naar 4uur rekenwerk kunnen gaan voor 1000 vectoren in 9D. Maar veel meer kan ik niet bedenken. Via veel testen heb ik kunnen achterhalen dat het aanmaken en werken met cellen, langer duurt dan het uitrekenen van afstanden.
tl;dr
Bijgevolg mijn vragen:
- bestaat er een datastructuur die het gedrag van cellen heeft? Dus SNEL dynamisch de variable uitbreiden met nieuwe objecten die in GROEP bij elkaar staan (dus geen array..).
- bestaat pass by reference? Het lijkt me dat matlab altijd een referentie geeft, indien de data gewijzigd wordt in een functie. Maar altijd een copy indien de data niet wijzig?
. Want de tijd is te kort om heel het algoritme op een structurele manier uit te werken.