Zeilenvektor sortieren [Matlab] |
23.05.2007, 01:03 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Zeilenvektor sortieren [Matlab] ich frage mich ob es möglich ist (eine Funktion schon gibt), zu gegebener Matrix A eine Matrix B zu erstellen, in denen die Einträge der Zeilenvektoren von A nach Größe sortiert werden. Beispiel: Gruß, tigerbine |
||||||||||||||||||||||
23.05.2007, 01:19 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
|
||||||||||||||||||||||
23.05.2007, 01:23 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Würde der ursprüngliche sort die Spalten sortieren? Wegen den zwei " ' "? |
||||||||||||||||||||||
23.05.2007, 01:27 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Ja.
|
||||||||||||||||||||||
23.05.2007, 01:28 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Danke Dir |
||||||||||||||||||||||
23.05.2007, 15:54 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Noch eine Frage, gibt es auch für dieses Sortierverhalten einen Befehl. Wieder Zeilenweise, jedoch müssen die Nachbarschaftsbeziehungen eingehalten werden. Also in der Art: Danke, tigerbine |
||||||||||||||||||||||
Anzeige | ||||||||||||||||||||||
|
||||||||||||||||||||||
23.05.2007, 16:11 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Also daraus werde ich nun gar nicht schlau. |
||||||||||||||||||||||
23.05.2007, 17:37 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Also dein Tipp von gestern hat mir schon stark geholfen. Die drei Einträge pro Zeile stehen nun für die Seitenlängen in einem Dreieck. Es werden insgesamt ziemlich viele Dreiecke. Ich möchte aus der Matrix auslesen, wie viele kongruente Dreiecke entstehen. Variante 1: so wie gesten. Das liefert mir aber "nur" die anzahl der Dreiecke mit gleichen Seitenlängen. Dann kann aber immer noch eine Achsensymmetrie vorliegen. Beispiel: Ein Dreieck habe die Seitenlängen 1,2 und 3. In der ersten Spalte soll dann die kleinste Seitenlänge stehen, also 1. Nun sind aber die Dreiecke a=1 b=2c=3 und a=1 b=3 und c=2 nicht kongruent. Variante 2: Man beläßt die Nachbarschaftsbeziehungen der Zahlen, nur bringt eben den kleinsten Eintrag in die erste Spalte. Dann gibt eine Doppelgängerabfrage die genaue Anzahl der kongruentem Dreiecke aus. Verstehst Du mich nun etwas besser? |
||||||||||||||||||||||
23.05.2007, 18:04 | AD | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Es geht um die Kugeldreiecke, ja? Und du rechnest mit Floating Point? Da sind = Vergleiche immer numerisch gefährlich, das ist dir hoffentlich bewusst... Wenn du jetzt sagst "selbstverständlich ist mir das bewusst", dann entschuldige ich mich für die Störung. |
||||||||||||||||||||||
23.05.2007, 18:35 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Ja es geht um die Dreiecke. Und du störst nicht. Wie müsste ich es denn einstellen? Oder vorgehen? Ich hab jetzt erstmal mit der Holzhammer Methode versucht einen Algorithmus zur Berechnung aufzustellen, so dass ich nachher weiß, welcher Eintrag in der Matrix für was steht. Meine Programmiererfahrung ist eher gering, so dass da sicherlich ne Menge Verbesserungspotenzial ist. Grundidee war die, dass die Maschinen ja auch nur eine best. Produktionsgenauigkeit haben. Ich wollte nun mit dem Programm schauen, ob ich bzgl. versch. Genauigkeiten dann eine Konvergenz /Parkettierung gegen max 3 bis 4 Dreiecke eintritt. Ich habe die Berechnungen jetzt für a=1 (Kantenlänge des Ikosaeder) gemacht. Und unter preferences das so eingestellt. Wahrscheinlich schlägst du die Hände über Kopf zusammen. also, wir würde es denn richtig gehen? Gruß
|
||||||||||||||||||||||
23.05.2007, 21:53 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Das, was du willst, ist offenbar das:
Was du genau willst, bleibt wir verborgen (ich habe deine Kugelproblem-Threads nicht gelesen); wenn du mit Fließkommazahlen umgehst, solltest du nur eben wissen, dass zwei Ergebnisse, die mathematisch gleich sein sollten, nicht unbedingt gleich sein müssen, denn triviale Dinge wie die Kommutativität der Addition sind nicht erfüllt. Wenn du vergleiche machst, solltest du ein gewisses Epsilon als Toleranz zulassen. |
||||||||||||||||||||||
23.05.2007, 22:10 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Danke, ich werde das gleich mal ausprobieren. |
||||||||||||||||||||||
23.05.2007, 23:10 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Was bedeutet denn (1) in Zeile 3? Desweiteren bekomme ich bei shift eine Fehlermeldung
Gruß |
||||||||||||||||||||||
23.05.2007, 23:27 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Das erste Element im Zeilenvektor size(A).
Ach, grml. Nimm einfach Octave. |
||||||||||||||||||||||
24.05.2007, 01:28 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Einfach sah bei mir so aus http://www.my-smileys.de/smileys3/crash_2.gif. Aber nun scheine ich es doch geschafft zu haben die Programme zu installieren und der erst Probelauf war auch erfolgreich. Vielleicht findest Du ja mal die Zeit mir deinen Sortieralgorithmus ine einer Sprache "für Dummies" zu erklären. Ich freue mich jetzt erstmal dass er funktioniert. |
||||||||||||||||||||||
24.05.2007, 09:18 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Eigentlich ist es ganz einfach, denn der sort-Befehl macht die ganze Arbeit: In der Matrix i steht nun, welches Element an welcher Stelle steht; interessant ist, wo das kleinste Element steht, also jeweils der erste Eintrag in einer Spalte. Ich gehe dann A einfach zeilenweise durch, verschiebe die Zahlen entsprechend (das macht shift) und schreibe das Ergebnis Zeile für Zeile nach B. |
||||||||||||||||||||||
24.05.2007, 12:18 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Dass Du nicht störst, habe ich dir ja schon gesagt. Vielleicht könnten wir dann ja mal die
fortsetzen. Ich hatte dazu ja schonmal eine Maple Ausgabe gepostet. Nehmen wir nun mal an, dass die sortierte matrix nun so aussieht:
Wie würde man beurteilen, ob 2 Zeilen (und damit 2 Dreiecke) kongruent sind? Kannst Du mir in Zahlen hier mal die Problematik mit floating point verdeutlichen? Ich habe diese Matrix ="Tabelle" nun einfach mal nach Access importiert und eine Doppelgänger Abfrage gemacht. Ich bin mir nun nicht ganz sicher, was sqrt(2) mit der Epsilon-Tolenranz meinte. Vielleicht dachte er, dass ich im Programm 2 Zeilen subtrahiere und dann mehr als das Ergebnis 0 als Gleichheit zulassen muss? Ich hatte jetzt für mich erstmal die Annahme gemacht, 2 Einträge sind gleich, wenn sie bzgl. der eingestellten Genauigkeit in Matlab gleich sind, also in obiger Matrix gleich sind. Gruß, tigerbine |
||||||||||||||||||||||
24.05.2007, 13:48 | AD | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Oje, du solltest mal eine Grundvorlesung Numerik hören... Ok, in Kurzform: Zwei solche "numerisch" ermittelten Floatingpont-Vektoren und sollte man dann als gleich ansehen, wenn mit k=0 oder k=1 ist. sollte nicht kleiner als gewählt werden, bei vielen Zwischenschritten zur Ermittlung von eher erheblich größer. Was du als Norm nimmst, ob nun die euklidische, die Maximum, oder die L1-Norm ... ist eigentlich wurst. Dummerweise lauert aber noch eine ganz andere Gefahr, auf die ich eigentlich anspielen wollte: Angenommen du hast drei Dreiecke: Zwei mit den Seitenlängen (3,4,5), eins mit (3,4,6). Durch die genannten Rundungsungenauigkeiten ergeben sich beispielsweise aber die Werte ( 3.000001 , 4.000000 , 5.000000 ) ( 2.999999 , 4.000000 , 5.000000 ) ( 3.000000 , 4.000000 , 6.000000 ) Das sort würde die Dreiecke gemäß lexikographischer Ordnung - in der Reihenfolge 1., dann 2. und letzlich 3.Komponente - nun so sortieren: ( 2.999999 , 4.000000 , 5.000000 ) ( 3.000000 , 4.000000 , 6.000000 ) ( 3.000001 , 4.000000 , 5.000000 ) Wenn du jetzt zwecks Feststellung, ob ein Dreieck mehrfach vorkommt, nur benachbarte Elemente im derart sortierten Feld unter die Lupe nimmst, dann wirst du dein blaues Wunder erleben... Oder wie anders willst du deine "Doppelgängerabfrage" anstellen? |
||||||||||||||||||||||
24.05.2007, 14:14 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Die hab ich wohl gehört, aber wir haben uns eben mehr mit Fragen in der Form "Existenz und Eindeutigkeit des Interpolationspolynoms" beschäftigt, als mit solchen Dingen. Sei also nachsichtig mit mir, wenn für dich offensichtliche Dinge für mich noch nicht klar sind. Ich werde mir den nächsten Absatz heute gegen Abend zu Gemüte führen (Soll ich bei Svensson ein paar Haare für Dich zum ausraufen bestellen, rein aus Vorbeugung? )
Mmh, da verstehe ich das mit den Nachbarn jetzt nicht. Ich habe die Tabelle unter 2 Gesichtspunkten sortieren wollen. Bleiben wir beim Dreieck (3,5,4). Nun kann es vorkommen, dass im Programm die Ausgabe (5,4,3) herauskommt. Die beiden Dreiecke wären aber aufgrund der Lage ihrer Seiten zueinander kongruent. 1. Deswegen wollte ich, dass das Programm so umsortiert, dass erst die kleinen Seiten, dann die großen (aber ohne Zerstörung ihrer Beziehung untereinander) aufgelistet werden. [also (3,4,5) darf nicht rauskommen). 2. Die Sortierung der Sortierten Zeilen war nur für mich als optisches Hilfsmittel gedacht, wenn ich mir den Ausdruck mal anschaue. 3. Doppelgängersuche war eben bislang über Access. Das hat dann aber nichts mit Nachbarn zu tun. Nun würde ich hier ja kein Epsilon (wie oben) berücksichtigen, sondern nur danach gehen, ob die Ziffern gleich sind. 4. Warum wollte ich das so machen? Ich dachte nun, dass die Maschine am Ende ja eine gewisse Produktionsgenauigkeit hat, auf Grund derer die Form hergestellt wird. Nehmen wir nun mal an, wir haben 2 Dreiecke gegeben und auch die exakten reellen Zahlen ihrer Seitenlängen. Wann würde die Maschine 2 gleiche Dreiecke herstellen, obwohl die im analytischen Sinne verschieden sind? Und so wollte ich Matlab eben runden lassen. Verstehst Du was ich meine? EDIT: Ichmeinte mit "gleich", gleich bezgl. der Rundung im Programm. Deswegen ist mir unklar, warum ich nochmal das "Epsilon" berücksichtigen soll. |
||||||||||||||||||||||
24.05.2007, 14:35 | AD | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Hab ich nicht gesagt, dass du das so machen sollst. Ok, vergiss es ... du vergleichst bei n Dreiecken also jedes mit jedem anderen, macht Paarvergleiche. |
||||||||||||||||||||||
24.05.2007, 14:44 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Ja, das war erstmal mein "Plan". Sollte mich das n² in der Anzahl der Vergleiche beunruhigen ? Und keine Ahnung wie das im "Duplikate suchen " Algorithmus von Access umgesetzt wird.
Jetzt bin ich didaktisch überfragt worauf sich der Satz bezieht. (Sieht schon wieder nach einem "geschlagen mit den eigenen Mitteln" aus ) Wäre schön, wenn Du dich des Edits des vorherigen Posts noch annehmen könntest. Ich verbschiede mich erstmal, muss auf's Amt. Gruß, tigerbine |
||||||||||||||||||||||
24.05.2007, 14:55 | AD | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Versteh ich nun wieder nicht: Du meinst also, bei gleichem theoretischem Resultat muss auch bei verschiedenen Rechenabläufen auf dem Weg dahin zumindest gerundet dasselbe herauskommen? Bei Fließkommaoperationen stimmt das i.a. nicht, da bin ich nicht der erste hier im Thread, der darauf hinweist:
Bei Kommutativität bin ich mir nicht so ganz sicher, bei Assoziativiät stimmt das aber ganz sicher: Sei die Fließkommaaddition, sagen wir double (64 Bit, darunter 53 Bit Mantisse). Dann rechne mal einerseits, und andererseits... |
||||||||||||||||||||||
24.05.2007, 20:56 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Nein, das meine ich nicht. Da scheinen wir aneinander vorbei zu reden. Ich meinte: Theoretisch wären die Resultate verschieden. Bei gleichem Rechenablauf am Ende erhält man aber am Ende gleiche gerundete Ergebnisse. Brechen wir es mal nur auf eine Rechnung runter. Die theoretischen Längen wären z.B.: Nun könnte die Maschine aber nur mm genau produzieren. Also müßte man doch jetzt Runden, oder? Dann stellt sich die Frage, wie. Da ich meine Beispielzahlen bzgl. der kaufmännischen Rundung gewählt habe, würde man dann doch erhalten Damit wären dei gerundeten Dreiecke gleich. EDIT: Mene Hausaufgabe rechne ich dann mal nach dem Abendessen... |
||||||||||||||||||||||
24.05.2007, 21:51 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Das kann dir passieren, ja. Da die hier problematische Rundung intern geschieht, liegt das auch nicht in deiner Macht zu ändern. Du musst eben wissen, wie viele signifikante Stellen du brauchst und wie viele dir der Datentyp bietet (Fehlerfortpflanzung beachten). |
||||||||||||||||||||||
25.05.2007, 10:26 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Jetzt verstehen wir uns. Wie müsste der Plan also lauten? 1. Ich frage nach, welche Angaben der Maschinenkonstrukteur braucht. (hab ich schon, aber noch keine Antwort) 2. Das bisherige Programm beurteilen 3. Das Programm muss dann (sicher) unter numerischen Aspekten geändert werden. Zu 2 und 3fehlt mir (noch) der Blick. Ich habe es jetzt erst mal so geschrieben, dass ich als Laie noch verstehe, was die jeweilige Schleife ausrechnet. Wäre dann lieb, wenn ihr mir helfen würdet. Ich würde das auch gerne besser verstehen. Gruß, tigerbine |
||||||||||||||||||||||
25.05.2007, 16:17 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Die Frage, wie genau es sein muss, muss auf jeden Fall als erstes geklärt und in Zahlen beantwortet werden. |
||||||||||||||||||||||
25.05.2007, 16:28 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Oki, ich warte da wie gesagt noch auf auf eine mail. Sobald ich die habe melde ich mich. |
||||||||||||||||||||||
26.05.2007, 01:09 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Habe Antwort Als Produktionsgenauigkeit und Rechengenauigkeit für Koordinaten oder ähnliches reicht ± 0,5mm aus. Die Teile werden voraussichtlich aufgeklebt und untereinander verklebt. Kleine Spalte werden dann einfach vom Kleber ausgefüllt. Die produzierbaren Seitenlängen liegen zwischen 0 und mm |
||||||||||||||||||||||
28.05.2007, 20:10 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Wenn du double als Datentyp nimmst (und MATLAB tut das standardmäßig), brauchst du dir dann in diesem Fall kaum einen Gedanken um die Fehlerfortpflanzung zu machen, wenn du deine Längen in Millimetern darstellst. Beim Vergleichen solltest du nur vorher immer auf Zehntelmillimeter runden. |
||||||||||||||||||||||
29.05.2007, 19:23 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Und schon steh ich vor dem nächsten Problem. Ich muss das ganze ja für verschiedene Kugelradien betrachten. Daraus ergeben sich dann ja auch verschiedene Kantenlängen a des der Rechnung zugrunde liegenden Ikosaeders. (Modlink: Weißes Dreieck). Nun bin ich mir nicht sicher, ob es besser ist
Nächste Rückfrage bezieht sich auf
Welche Art der Rundung sollte man denn hier nehmen? Die Bauteile werden ja verklebt. Ich hätte jetzt intuitiv gedacht, dass es besser ist immer abzurunden, da man Zwischenräume einfacher ausgleichen kann. Wenn es im Worst-Case-Fall passiert, dass alle Werte aufgerundet werden, müsste man ja in der Praxis Teile verkleinern. Das Stelle ich mir bei Styropor eher schwierig vor. Um die Fragen zu klären, schauen wir an besten in den Algorithmus, oder? Zum Programm. Erläuterungen folgen hier. Speichern von Punktkoordinaten Diese werden wie folgt in der Block-Matrix M gespeichert: Speichern von Längen nach der Projektion Erfolgt in den 3 Dreiecksmatrizen Horizontal, Vertikal, Diagonal: Speichern von Dreiecken - 2 Typen B: Blau O: Orange Danach kommen sie in eine Matrix T Sortiert werden sie bislang noch nicht. Da der Befehlt ja in Matlab nicht klappen wollte. Für die Frage ob a=1 dann R oder R eingeben sollte dies keine Rolle spielen. |
||||||||||||||||||||||
29.05.2007, 19:27 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Programm Umschalten zweischen a und R in Zeile 14 bzw 20,21
|
||||||||||||||||||||||
29.05.2007, 19:47 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Ausgabe Matlab KURZE AUSGABE
LANGE AUSGABE
|
||||||||||||||||||||||
29.05.2007, 19:50 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Augabe Octave Warum läuft das hier nicht durch?
|
||||||||||||||||||||||
30.05.2007, 00:04 | sqrt(2) | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Du befindest dich mit deinen Rechnungen in einem Zahlenbereich, in dem du keine Angst haben musst, durch fehlende Mantissenlänge massiv an Genauigkeit zu verlieren. In dieser Hinsicht darfst du das hier machen, wie du willst.
Egal. Du rundest unterhalb der geforderten Genauigkeit und arbeitest mit den gerundeten Werten auch nicht weiter.
Octave gibt dir lange Ausgaben in einem Modus aus, in dem du vor- und zurückblättern kannst (mit f und b, die Pfeiltasten sollten auch funktionieren). |
||||||||||||||||||||||
30.05.2007, 00:49 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Punkt 1: Punkt 3: Ja die Funktionieren. Dachte nur das bedeutet Fehler im Programm ******************************************************** Punkt 2: Mmh, hier hab es wieder geschafft auf der Leitung zu stehen. Gehen wir mal in das Beispiel. Da kam ja nun als unsortierte Matrix raus:
Das sind 3 kongruente Dreiecke und 1. Die Dreiergruppe taucht in allen möglichen Vektordarstellungen auf. Jetzt nehmen wir mal an, wir hätten einen SortierAlgorithmus Sorty (Bei der Kombi Sort/Shift von dir wird ein Fall nicht erfaßt. Leider.) Es käme dann raus:
Dabei wurden hier die Seitenlängen auf a=1 bezogen. Wenn man nun eine Kugel vom Radius R=20m=2 000cm=200 000mm hat, dann ist Wie sollte man nun vorgehen, um 2 Dreiecke für die Produktion als kongruent zu kennzeichnen. Variante A:
Variante B: Hier bin ich noch nicht ganz schlüssig. Wieviel genauer ist denn Matlab als das was ich am Ende brauche. D.h. müßte /könnte ich vielleicht die Matrix S schon einmal runden, um mehr kongruente Flächen zu bekommen? Die Variante sollten wir vielleicht insoweit verschieben, als das man erstmal den Fall A auswertet, ob produzierbare Dreiecke mit maximal 3 Formen rauskommen. EDIT: Es muss wohl doch irgendwie T vor dem Sortieren gerundet werden. Dazu müsste man wie gesagt festlegen, auf wie vieleie Stellen. Fallbeispiel:
Danke für die Mühe, die Posts hier sind ja was aufwinder zu lesen. |
||||||||||||||||||||||
30.05.2007, 02:04 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Sorty-Versuch Hiermit sollte der Fall, dass z.B. der Vektor [1 2 1] nicht zu [1 1 2] umsortiert wird umgangen sein. Laufzeiten und sonstigen Optimierungen habe ich keine Ahnung. Konstruktive Kritik willkommen.
|
|
Verwandte Themen
Die Beliebtesten » |
Die Größten » |
|
Die Neuesten » |