Waarom wil je dat niet?quote:Op dinsdag 30 oktober 2018 12:00 schreef Bosbeetle het volgende:
[..]
Wat bij mij het probleem is ik maak code omdat ik het gebruik... en waarvoor ik het gebruik komt op mijn pad tijdens het maken van de code... en dat blijft zo door loopen. Ik zit niet in de positie om goed af te bakenen wat moet die software nou eigenlijk kunnen, en dat wil ik ook eigenlijk niet
Omdat ik altijd vind dat we meer moeten kunnen dan ik van te voren bedacht....quote:Op dinsdag 30 oktober 2018 12:02 schreef FlippingCoin het volgende:
[..]
Waarom wil je dat niet?
Ar cieņu Flip.
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | package Neigbours; public class coordinates { double[] x,y,z,x2,y2,z2; double max; double[][] distmat; coordinates(double[] x, double[] y){ this.x = x; this.y = y; MakeDistmat(x,y,null); } coordinates(double[] x, double[] y, double[] z){ this.x = x; this.y = y; this.z = z; MakeDistmat(x,y,z); } coordinates(double[] x1, double[] y1, double[] x2, double[] y2){ this.x = x1; this.y = y1; this.x2 = x2; this.y2 = y2; MakeDistmat(x1,y1,null,x2,y2,null); } coordinates(double[] x1, double[] y1, double[] z1, double[] x2, double[] y2, double[] z2){ this.x = x1; this.y = y1; this.z = z1; this.x2 = x2; this.y2 = y2; this.z2 = z2; MakeDistmat(x1,y1,z1,x2,y2,z2); } private void MakeDistmat(double[] x, double[] y, double[] z){ double[][] dmat = new double[x.length][x.length]; if(z == null){ z = new double[x.length]; for(int i=0;i<z.length;i++){ z[i] = 0; } } this.max = 0; for(int i=0;i<x.length;i++){ for(int j=0;j<x.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x[i]-x[j],2) + Math.pow(y[i]-y[j],2) + Math.pow(z[i]-z[j],2) ); if(dmat[i][j]>max){ this.max=dmat[i][j]; } } } this.distmat = dmat; } private void MakeDistmat(double[] x1, double[] y1, double[] z1, double[] x2, double[] y2, double[] z2){ double[][] dmat = new double[x1.length][x2.length]; this.max = 0; if(z1 == null || z2 == null){ z1 = new double[x1.length]; z2 = new double[x2.length]; for(int i=0;i<z1.length;i++){ z1[i] = 0; } for(int i=0;i<z2.length;i++){ z2[i] = 0; } } for(int i=0;i<x1.length;i++){ for(int j=0;j<x2.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x1[i]-x2[j],2) + Math.pow(y1[i]-y2[j],2) + Math.pow(z1[i]-z2[j],2) ); if(dmat[i][j]>max){ this.max=dmat[i][j]; } } } this.distmat = dmat; } } |
Maar je kan toch abstraheren en uitbreidbaar ontwerpen?quote:Op dinsdag 30 oktober 2018 12:16 schreef Bosbeetle het volgende:
[..]
Omdat ik altijd vind dat we meer moeten kunnen dan ik van te voren bedacht....
Meestal schrijf ik programma's om data heen, dus als de data iets interesants laat zien wat ik van te voren niet bedacht had dan moet de software ineens meer kunnen.... Als je alles netjes dichttimmert krijg je nooit nieuewe functionaliteit...
Laatste paar stukjes software die ik geschreven heb zijn nearest neighbour analyses (zowel tussen twee puntensets of binnen één, en zowel los (elk punt heeft een dichte buurman) als strikt (elk punt kan maar aan één paar toe behoren).... Heb dit eindelijk eens goed in elkaar gezet omdat ik al tig scripts had waarin ik dit ook deed maar nu heb ik gewoon een goed stukje snelle code
Ik ben ook geen programmeur, kun jij misschien naar mijn edit kijken of daar handiger op lossingen voor zijn....quote:Op dinsdag 30 oktober 2018 12:18 schreef FlippingCoin het volgende:
[..]
Maar je kan toch abstraheren en uitbreidbaar ontwerpen?
आपला आभारी Flip.
Constructor overloading en dan de constructor met minder argumenten de Z waarden op 0 zetten? Denk dat dat de Java manier is.quote:Op dinsdag 30 oktober 2018 12:19 schreef Bosbeetle het volgende:
[..]
Ik ben ook geen programmeur, kun jij misschien naar mijn edit kijken of daar handiger op lossingen voor zijn....
Ik bedenk me dat ik die constructors voor data met alleen x en y weg zou kunnen laten en dan een null in z gooien maar dat ziet er dan weer lelijk uit als je het aanroept.
Ja ik zou liever één constructor hebben en één makedistmat... maar ik zie niet precies in hoe... En ik wil ook weer niet enorm gaan zitten iffen in de makedistmat... die 0 is gewoon een wiskundige truuk eigenlijk omdat je een 2d punt gewoon kun behandelen als een 3d punt met een z van 0.quote:Op dinsdag 30 oktober 2018 12:23 schreef FlippingCoin het volgende:
[..]
Constructor overloading en dan de constructor met minder argumenten de Z waarden op 0 zetten? Denk dat dat de Java manier is.
мэндчилсэн Flip.
Java is even geleden maar je kan toch vanuit de minst specifieke constructor de specifiekere constructor aanroepen zodat de minst specifieke louter de z waarden op 0 zet en dan de "normale" constructor aanroept?quote:Op dinsdag 30 oktober 2018 12:26 schreef Bosbeetle het volgende:
[..]
Ja ik zou liever één constructor hebben en één makedistmat... maar ik zie niet precies in hoe... En ik wil ook weer niet enorm gaan zitten iffen in de makedistmat... die 0 is gewoon een wiskundige truuk eigenlijk omdat je een 2d punt gewoon kun behandelen als een 3d punt met een z van 0.
dat is wel een slimme ga ik doen Dat doe ik nu in de makedistmat maar dat is logischer in de constructor inderdaad.quote:Op dinsdag 30 oktober 2018 12:27 schreef FlippingCoin het volgende:
[..]
Java is even geleden maar je kan toch vanuit de minst specifieke constructor de specifiekere constructor aanroepen zodat de minst specifieke louter de z waarden op 0 zet en dan de "normale" constructor aanroept?
Saludos cordiales Flip.
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | package Neigbours; public class coordinates { double[] x,y,z,x2,y2,z2; double max; double[][] distmat; coordinates(double[] x, double[] y){ double[] z_ = new double[x.length]; for(int i=0;i<z.length;i++){ z_ = 0; } this(x,y,z_); } coordinates(double[] x, double[] y, double[] z){ this.x = x; this.y = y; this.z = z; MakeDistmat(x,y,z); } coordinates(double[] x1, double[] y1, double[] x2, double[] y2){ double[] z_ = new double[x1.length]; double[] z2_ = new double[x2.length]; for(int i=0;i<x.length;i++){ z_ = 0; } for(int i=0;i<x2.length;i++){ z2_ = 0; } this(x1,y1,z_,x2,y2,z2_); } coordinates(double[] x1, double[] y1, double[] z1, double[] x2, double[] y2, double[] z2){ this.x = x1; this.y = y1; this.z = z1; this.x2 = x2; this.y2 = y2; this.z2 = z2; MakeDistmat(x1,y1,z1,x2,y2,z2); } private void MakeDistmat(double[] x, double[] y, double[] z){ double[][] dmat = new double[x.length][x.length]; this.max = 0; for(int i=0;i<x.length;i++){ for(int j=0;j<x.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x[i]-x[j],2) + Math.pow(y[i]-y[j],2) + Math.pow(z[i]-z[j],2) ); if(dmat[i][j]>max){ this.max=dmat[i][j]; } } } this.distmat = dmat; } private void MakeDistmat(double[] x1, double[] y1, double[] z1, double[] x2, double[] y2, double[] z2){ double[][] dmat = new double[x1.length][x2.length]; this.max = 0; for(int i=0;i<x1.length;i++){ for(int j=0;j<x2.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x1[i]-x2[j],2) + Math.pow(y1[i]-y2[j],2) + Math.pow(z1[i]-z2[j],2) ); if(dmat[i][j]>max){ this.max=dmat[i][j]; } } } this.distmat = dmat; } } |
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | package Neigbours; public class coordinates { double[] x,y,z,x2,y2,z2; double max; double[][] distmat; coordinates(double[] x, double[] y){ this(x,y,null); } coordinates(double[] x, double[] y, double[] z){ if(z==null){ z = new double[x.length]; for(int i=0;i<z.length;i++){ z[i] = 0; } } this.x = x; this.y = y; this.z = z; MakeDistmat(x,y,z); } coordinates(double[] x1, double[] y1, double[] x2, double[] y2){ this(x1,y1,null,x2,y2,null); } coordinates(double[] x1, double[] y1, double[] z1, double[] x2, double[] y2, double[] z2){ if(z1==null || z2 == null){ z1 = new double[x1.length]; z2 = new double[x2.length]; for(int i=0;i<z1.length;i++){ z1[i] = 0; } for(int i=0;i<z2.length;i++){ z2[i] = 0; } } this.x = x1; this.y = y1; this.z = z1; this.x2 = x2; this.y2 = y2; this.z2 = z2; MakeDistmat(x1,y1,z1,x2,y2,z2); } private void MakeDistmat(double[] x, double[] y, double[] z){ double[][] dmat = new double[x.length][x.length]; this.max = 0; for(int i=0;i<x.length;i++){ for(int j=0;j<x.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x[i]-x[j],2) + Math.pow(y[i]-y[j],2) + Math.pow(z[i]-z[j],2) ); if(dmat[i][j]>max){ this.max=dmat[i][j]; } } } this.distmat = dmat; } private void MakeDistmat(double[] x1, double[] y1, double[] z1, double[] x2, double[] y2, double[] z2){ double[][] dmat = new double[x1.length][x2.length]; this.max = 0; for(int i=0;i<x1.length;i++){ for(int j=0;j<x2.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x1[i]-x2[j],2) + Math.pow(y1[i]-y2[j],2) + Math.pow(z1[i]-z2[j],2) ); if(dmat[i][j]>max){ this.max=dmat[i][j]; } } } this.distmat = dmat; } } |
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | package Neigbours; public class coordinates { double[] x,y,z,x2,y2,z2; double max; double[][] distmat; coordinates(double[] x, double[] y){ this(x,y,null); } coordinates(double[] x, double[] y, double[] z){ this(x,y,z,null,null,null); } coordinates(double[] x1, double[] y1, double[] x2, double[] y2){ this(x1,y1,null,x2,y2,null); } coordinates(double[] x1, double[] y1, double[] z1, double[] x2, double[] y2, double[] z2){ if(z1==null){ z1 = new double[x1.length]; for(int i=0;i<z1.length;i++){ z1[i] = 0; } } if(z2==null && x2 != null){ z2 = new double[x2.length]; for(int i=0;i<z2.length;i++){ z2[i] = 0; } } this.x = x1; this.y = y1; this.z = z1; if(x2==null) { MakeDistmat(x1, y1, z1); }else{ this.x2 = x2; this.y2 = y2; this.z2 = z2; MakeDistmat(x1, y1, z1, x2, y2, z2); } } private void MakeDistmat(double[] x, double[] y, double[] z){ double[][] dmat = new double[x.length][x.length]; this.max = 0; for(int i=0;i<x.length;i++){ for(int j=0;j<x.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x[i]-x[j],2) + Math.pow(y[i]-y[j],2) + Math.pow(z[i]-z[j],2) ); if(dmat[i][j]>max){ this.max=dmat[i][j]; } } } this.distmat = dmat; } private void MakeDistmat(double[] x1, double[] y1, double[] z1, double[] x2, double[] y2, double[] z2){ double[][] dmat = new double[x1.length][x2.length]; this.max = 0; for(int i=0;i<x1.length;i++){ for(int j=0;j<x2.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x1[i]-x2[j],2) + Math.pow(y1[i]-y2[j],2) + Math.pow(z1[i]-z2[j],2) ); if(dmat[i][j]>max){ this.max=dmat[i][j]; } } } this.distmat = dmat; } } |
Ik moet moeite doen om je code te volgen, en dat is iha een teken dat je code te chaotisch is.quote:Op dinsdag 30 oktober 2018 13:58 schreef Bosbeetle het volgende:
optie vier:
[ code verwijderd ]
hehe sorry voor de spam, nu de vraag welke zouden jullie gebruiken?
Ja dat versie 1 dus niet maar daar zit dan weer heel veel duplicatie in.quote:Op dinsdag 30 oktober 2018 19:20 schreef ralfie het volgende:
[..]
Ik moet moeite doen om je code te volgen, en dat is iha een teken dat je code te chaotisch is.
Code die specifiek is voor het aantal meegegeven argumenten aan een constructor zet je in de specifieke constructor, de rest prop je in een initialize methode. Dat this() is zoo lelijk, maar goed, ik heb een java-allergie Het gevaar zie je in je code. Als je de eerste constructor gebruikt (ctor(double[], double[])), moet je vier(!) constructors doorploegen voordat je weet wat je code doet...
Tuurlijk heb je leren programmeren anders had je dit niet al gehad Ik ben zelf nu fullstack developer maar heb ook maar medische wetenschappen gestudeerd. De rest is hobby -->> werkquote:Op dinsdag 30 oktober 2018 19:25 schreef Bosbeetle het volgende:
[..]
Ja dat versie 1 dus niet maar daar zit dan weer heel veel duplicatie in.
Is er een elegantere oplossing hiervoor?
Hoe zou je het bijvoorbeeld doen zonder die methode? Elke constructor zelf een matrix laten berekenen?
Zoals ik zeg ik heb nooit leren programmeren ik doe maar wat
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | class DistanceMatrix2D { double[,] distances; double maxLength = 0; constructor(Vector2D[] points) { //OF this(points, points) distances= new double[points.length, points.length]; for(int x=0;x<points.length;x++) { for(int y=0;y<points.length;y++) { this.distances[x,y] = (points[x] - points[y]).length(); this.maxLength = Math.max(this.distances[x,y], this.maxLength); } } } constructor(Vector2D[] points1, Vector2D[] points 2) { distances= new double[points1.length, points2.length]; for(int x=0;x<points1.length;x++) { for(int y=0;y<points2.length;y++) { this.distances[x,y] = (points1[x] - points2[y]).length(); this.maxLength = Math.max(this.distances[x,y], this.maxLength); } } } } class DistanceMatrix3D { double[,] distances; double maxLength = 0; constructor(Vector3D[] points) { //OF this(points, points) this.distances= new double[points.length, points.length]; for(int x=0;x<points.length;x++) { for(int y=0;y<points.length;y++) { this.distances[x,y] = (points[x] - points[y]).length(); this.maxLength = Math.max(this.distances[x,y], this.maxLength); } } } constructor(Vector3D[] points1, Vector2D[] points 2) { this.distances= new double[points1.length, points2.length]; for(int x=0;x<points1.length;x++) { for(int y=0;y<points2.length;y++) { this.distances[x,y] = (points1[x] - points2[y]).length(); this.maxLength = Math.max(this.distances[x,y], this.maxLength); } } } } |
Ah okay dit snap ik maar als wetenschapper heb ik liever toegang tot mijn eigen methodes een cartesian coordinaten paar behandelen als een vector zou ik niet doen, dan val te snel in valkuilen als length zien als een afstand terwijl dat in deze de lengte van de vector is wat voor coördinaten niet echt iets betekend. Een extra klasse maken voor 3d ten opzichte van 2D zorgt dat ik in de bovenliggende code veel meer moet gaan testen en aanroepen.quote:Op dinsdag 30 oktober 2018 20:43 schreef ralfie het volgende:
[..]
Tuurlijk heb je leren programmeren anders had je dit niet al gehad Ik ben zelf nu fullstack developer maar heb ook maar medische wetenschappen gestudeerd. De rest is hobby -->> werk
Om met het meest obvious antwoord te komen: je bent bezig met vectoren en daar zijn in Java standaard classes voor: Vector2D en Vector3D in java. (even snel gegoogled: https://docs.oracle.com/c(...)ecmath/Vector2d.html, geen idee of het wat is, heb nog nooit iets in Java gedaan). De standaard classes hebben standaard properties zoals length, wat feitelijk is wat je berekend. In jouw geval zou je twee arrays van vectoren doorlopen om de max length van elk item te bepalen.
[ code verwijderd ]
(code geschreven in fok! 'IDE' en met 0 ervaring in Java, dus mogelijk vol met fouten (en ook mogelijk niet wat je bedoeling was). Maar je snapt het idee neem ik aan?
De code laat ook goed zien dat jouw code feitelijk uit twee distincte scenarios bestaat: 2d en 3d, met daarbinnen de mogelijkheid een array met zichzelf of met een andere array te vergelijken. Vandaar dat ik dit in twee classes zou doen. Leest net wat makkelijker.
Mocht je geen zin hebben in vectoren blijft de code qua structuur hetzelfde, alleen zit er iets meer wiskunde in sommige regels.
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | package Neigbours; public class coordinates { double[] x,y,x2,y2; double max; double[][] distmat; coordinates(double[] x, double[] y){ this.x = x; this.y = y; MakeDistmat(x,y,x,y); } coordinates(double[] x1, double[] y1,double[] x1, double[] y1){ this.x = x1; this.y = y1; this.x2 = x2; this.y2 = y2; MakeDistmat(x1,y1,x2,y2); } private void MakeDistmat(double[] x1, double[] y1, double[] x2, double[] y2){ double[][] dmat = new double[x1.length][x2.length]; this.max = 0; for(int i=0;i<x1.length;i++){ for(int j=0;j<x2.length;j++){ dmat[i][j] = Math.sqrt( Math.pow(x1[i]-x2[j],2) + Math.pow(y1[i]-y2[j],2) ); this.max = Math.max(dmat[i][j],this.max); } } this.distmat = dmat; } } public class coordinates3D extends coordinates { double[] z,z2; coordinates3D(double[] x, double[] y, double[] z){ super(x,y); this.z = z; addZdist(z,z); } coordinates3D(double[] x1, double[] y1,double[] z1, double[] x2, double[] y2, double[] z2){ super(x1,y1,x2,y2); this.z = z1; this.z2 = z2; addZdist(z1,z2); } private void addZdist(double[] z1, double[] z2 ){ super.max=0; for(int i=0;i<super.distmat.length;i++){ for(int j=0;j<super.distmat[0].length;j++){ super.distmat[i][j] = Math.sqrt( Math.pow(super.distmat[i][j],2) + Math.pow(z1[i]-z2[j],2) ); super.max = Math.max(super.distmat[i][j],super.max); } } } } |
De gebruikte versie van je library kan je vastzetten, vrijwel alle grote systemen gebruiken libraries.quote:Op dinsdag 30 oktober 2018 23:22 schreef Bosbeetle het volgende:
Ik heb helaas wel geleerd om zo min mogelijk van externe pakketen of functies afhankelijk te zijn omdat ze die nog wel eens willen veranderen.
hoevaak ik wel niet normalisatie functies heb gezien die echt rare dingen met je data doen, terwijl zo makkelijk zelf te schrijven zijn....
Als je een attribuut of methode protected maak dan kan je erbij vanuit het package en subclasses, by default zijn attributen in java private dacht ik.quote:Op woensdag 31 oktober 2018 09:13 schreef Bosbeetle het volgende:
[ code verwijderd ]
zo dan 2 klasses 1 voor 2D en een extend naar 3D, de construct method voor de matrix gereduceerd naar 1 method per klasse... en dus geen gedoe meer met de z naar 0 zetten...
Het enige wat ik me nu afvraag of ik bij de x en y cooordinaten kan vanuit de coordinates3D via this.x of this.y of dat ik daar nu getters voor moet schrijven die super.x kunnen returnen?
Snap ik ik werk nu met imagej dus ik zit ook al aan een api/library vastquote:Op woensdag 31 oktober 2018 12:45 schreef FlippingCoin het volgende:
[..]
De gebruikte versie van je library kan je vastzetten, vrijwel alle grote systemen gebruiken libraries.
Ezgu tilaklar ila Flip.
Iets duidelijker gezegd ik heb dus class1 met x en y, en die wordt geextend naar class2 met een z.quote:Op woensdag 31 oktober 2018 12:49 schreef FlippingCoin het volgende:
[..]
Als je een attribuut of methode protected maak dan kan je erbij vanuit het package en subclasses, by default zijn attributen in java private dacht ik.
Ar cieņu Flip.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class1{ int a = 6; class1(){ } } class2 extends class1{ int b = 7; class2(){ super(); //niet nodig persee } } en dan ergens de code class1 obj = new class2(); system.out.println("a: "+obj.a); system.out.println("b: "+obj.b); |
Zoals in jouw voorbeeld, zou je attribuut a moeten opnemen als:quote:Op woensdag 31 oktober 2018 13:08 schreef Bosbeetle het volgende:
[..]
Iets duidelijker gezegd ik heb dus class1 met x en y, en die wordt geextend naar class2 met een z.
Als ik dan class1 object = new class2(); doe kan ik dan vervolgens object.x doen (ik denk het wel) en ook object.z m.a.w. heeft het object de fields van zowel zijn eigen klasse als zijn superklasse.
[ code verwijderd ]
werkt dat?
1 | protected int a = 6; |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |