| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
Autor
|
Thema: Zeile/Spalte aus einer Matrix löschen (11744 mal gelesen)
|
Tusor Mitglied
Beiträge: 47 Registriert: 31.10.2004
|
erstellt am: 18. Mai. 2007 09:14 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich stehe gerade vor dem Problem, dass ich innerhalb einer MathCAD-Funktion gern eine Zeile und Spalte aus einer Matrix löschen will. Es geht darum, dass ich erst eine Matrix aufstelle, die alle meine Werte enthält. An Hand der Matrix kann ich dann prüfen, welche Zeilen/Spalten ich nicht mehr brauche und will die wieder rauslöschen. Das einzigste was mir einfällt ist, dass ich die verbleibenden Werte aus meiner Ausgangsmatrix in einer entsprechend kleinere kopiere und dabei die ungewünschten auslasse. Diese Möglichkeit finde ich aber nicht sonderlich elegant. Hat da jemand evtl. noch eine clevere Idee? mfg Tusor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 18. Mai. 2007 09:27 <-- editieren / zitieren --> Unities abgeben: Nur für Tusor
im Matrix-Einfügedialog gibts auch ein Button "Löschen" .. da löscht er dir dann die Zeilen/Spaltenanzahl ab aktueller Cursorposition ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Oberli Mike Moderator Dipl. Maschinen Ing.
Beiträge: 3731 Registriert: 29.09.2004 Mathcad war besser als Prime, meine Meinung.
|
erstellt am: 18. Mai. 2007 09:42 <-- editieren / zitieren --> Unities abgeben: Nur für Tusor
Hallo Tusor, Die manuelle Art hat Thomas beschrieben. Natürlich kann man das auch rechnerisch erreichen. Dafür muss man sich nur ein wenig mit den Matrixoperationen beschäftigen. Im angehängten File (gespeichert unter Version 11) ist ein Programm, welches auch im Thread Beispiele für Berechnungen im Beispiel der Fachwerksberechnung zu finden ist. Diese Programm baut eine Einheitsmatrix auf, bei welcher vorgegebene Spalten fehlen. Durch eine Matrixmultiplikation lassen sich dann die gewünschten Spalten oder Zeilen einer Vorgegebenen Matrix entfernen. Dasa Programm wurde geschrieben um eine Steifigkeitsmatrix für eine FEM - Berechnung um die gebundenen Freiheitsgrade zu reduzieren. Somit ist immer einer n*n Matrix vorgegeben. Das Programm kann aber auch für eine n*m Matrix angewendet werden, man muss sich nur überlegen wir gross die Einheitsmatrix sein muss Programm mit freundlicher Genehmigung von Prof. Ing. Karl Schöllhorn von der FH Nordwestschweiz in Windisch- Gruss Mike ------------------
The Power Of Dreams Schreib mal wieder Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tusor Mitglied
Beiträge: 47 Registriert: 31.10.2004
|
erstellt am: 18. Mai. 2007 13:59 <-- editieren / zitieren --> Unities abgeben:
|
Smucums Mitglied Konstrukteur
Beiträge: 38 Registriert: 24.06.2002 Creo Paramtric 4.0 M030 Windchill 11.0 M030 MathCAD 15 F000
|
erstellt am: 09. Nov. 2010 08:16 <-- editieren / zitieren --> Unities abgeben: Nur für Tusor
Hallo Community, zum Thema Zeilen- bzw. Spalten löschen aus eine Matrix sind hier im Forum einige gute Beispiele zu finden. Ich stehe in meinem Fall vor dem Problem, dass ich aus Messungen heraus eine Matrix mit Fehlstellen ("NaN") erhalten habe, siehe Anhang. Nun gilt es, einen Vektor aufzubauen, der genau die Zeilenindizes enthält, auf dem "NaN" vorkommt. Hat hierzu jemand einen Vorschlag, wie man das realisieren könnte? MfG Smucums ------------------ „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Edward A. Murphy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tusor Mitglied
Beiträge: 47 Registriert: 31.10.2004
|
erstellt am: 09. Nov. 2010 08:34 <-- editieren / zitieren --> Unities abgeben:
Hi, ich muss zugeben, dass ich mittlerweile von MathCAD zu MATLAB gewechselt bin. Dort kann man das schön mit isnan() prüfen . Aber vielleicht gibt es ja eine ähnliche Funktion auch bei MathCAD. Oder man prüft die Elemente in einer Schleife einzeln und baut sich den Vektor selbst. Treten die NaN nur in der zweiten Spalte auf? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Smucums Mitglied Konstrukteur
Beiträge: 38 Registriert: 24.06.2002 Creo Paramtric 4.0 M030 Windchill 11.0 M030 MathCAD 15 F000
|
erstellt am: 09. Nov. 2010 09:19 <-- editieren / zitieren --> Unities abgeben: Nur für Tusor
Hallo Tusor, in diesem Falle ja, weil ich die Matrizen immer nach der ersten Spalte sortiere (Lage der Messpunkte). Auch im MathCAD gibt es einen Befehl (IsNaN), der entweder 0 oder 1 ausgibt. Aber irgendwie ist hier der missing link ( ) - wie gehts damit weiter? MfG Smucums ------------------ „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Edward A. Murphy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tusor Mitglied
Beiträge: 47 Registriert: 31.10.2004
|
erstellt am: 09. Nov. 2010 09:39 <-- editieren / zitieren --> Unities abgeben:
Naja, wie es damit weiter geht, kann ich dir leider nicht sagen, weil ich kein MathCAD zur Hand habe. Kann man den Befehl nur auf ein Skalar oder auch auf eine Matrix anwenden? Was ist das Ergebnis? In MATLAB gibt es auch noch einen find-Befehl, der die Indizes von Elementen zurückgibt, die verschieden von Null sind bzw. andere Kriterien erfüllen. Gibt es das vielleicht auch in MatCAD? Mit isnan könnte man halt auch die Schleifengeschichte programmieren: Du schaust dir jedes Element an und speicherst seinen Index in einer Liste, wenn er halt NaN ist. Und die gibst du dann wieder aus. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Clayton Ehrenmitglied Konstrukteur
Beiträge: 1632 Registriert: 07.02.2004 AMD Athlon 64X2 5600+, 1GB, Nvidia Quadro Pro FX 1100 Inventor Series 10 Mathcad 13
|
erstellt am: 09. Nov. 2010 13:25 <-- editieren / zitieren --> Unities abgeben: Nur für Tusor
Zitat: Original erstellt von Smucums: in diesem Falle ja, weil ich die Matrizen immer nach der ersten Spalte sortiere (Lage der Messpunkte). Auch im MathCAD gibt es einen Befehl (IsNaN), der entweder 0 oder 1 ausgibt. Aber irgendwie ist hier der missing link ( nosmile: - wie gehts damit weiter?
Hi, Wenn Du die Dinger suchen willst, kann man auch z.B. Index:=matchNaN(M) verwenden und, nachdem man entschieden hat, ob man die Werte ganz loescht oder sie z.B. mit dem Durchschnitt der Daten auswechselt, weiter machen. Nur weiss ich nicht, ob man dazu das Data Analysis Extension Pack braucht. Gruss Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Smucums Mitglied Konstrukteur
Beiträge: 38 Registriert: 24.06.2002
|
erstellt am: 09. Nov. 2010 13:57 <-- editieren / zitieren --> Unities abgeben: Nur für Tusor
Hallo Clayton, danke für die Antwort - es entwickelt sich langsam ein Dialog Nun, matchNaN ist genau dass, was mir noch fehlte. Ich will mit den verbleibenden Messstellen auch hier wieder eine Regressionsrechnung durchführen. Ich bin mir (fast) sicher, dass ich dafür die NaN-Stellen nicht notwendigerweise entfernen muss. Jedoch verwirrt derren Angabe in den Matrizen, so dass ich diese lieber entfernt haben möchte. Also "bastel" ich mir eine entsprechende Matrix und multipliziere sie transponiert von links. Dann sollte eine bereinigte Matrix ohne die NaN-Zeilen als Ergebnis herauskommen. Da muss ich jetzt weitermachen... BTW - wir nutzen hier die Version 15, wo das Data Analysis Extension Pack standardmäßig dabei ist. MfG Smucums ------------------ „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Edward A. Murphy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Clayton Ehrenmitglied Konstrukteur
Beiträge: 1632 Registriert: 07.02.2004 AMD Athlon 64X2 5600+, 1GB, Nvidia Quadro Pro FX 1100 Inventor Series 10 Mathcad 13
|
erstellt am: 09. Nov. 2010 15:31 <-- editieren / zitieren --> Unities abgeben: Nur für Tusor
Hi, Du kannst natuerlich auch IsNaN verwenden --> Ich habe in diesem Fall die offenen Positionen mit dem Durchschnitt der verbliebenen ersetzt, vielleicht ist es das, was Du suchst. Aber bleibt Dir ueberlassen. Gruss [Diese Nachricht wurde von Clayton am 09. Nov. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anwendungstechniker (m/w/d) | Die Firma abopart ist einer der führenden Hersteller von mobilen Trennwänden in Deutschland. Sie beschäftigt ca. 80 Mitarbeiter am Standort Bad Zwischenahn bei Oldenburg (Oldb.). Der Einsatzbereich von Mobilwänden ist überall dort sinnvoll, wo flexible Raumlösungen benötigt werden wie z.B. in Hotels, Gemeindehäusern, Mehrzweckhallen, Kirchen, Casinos, Industriegebäuden, Versammlungs- und Besprechungsräumen.... | Anzeige ansehen | Technischer Zeichner, Bauzeichner |
|
Smucums Mitglied Konstrukteur
Beiträge: 38 Registriert: 24.06.2002
|
erstellt am: 09. Nov. 2010 16:26 <-- editieren / zitieren --> Unities abgeben: Nur für Tusor
Hallo Clayton, dein Ansatz sieht vielversprechend aus. Sofern ich das richtig verstehe, hast du die NaN-Positionen mit Werten überschrieben. Bei hinreichend kleinen Lücken im Vergleich zur Anzahl der angegebenen Werte wird das sicherlich gut funktionieren. Das werde ich mal testen. Ich habe mir gegenwärtig auf einem anderen Weg beholfen, indem ich die fehlenden Werte mit 0 ersetzt habe, die Daten stammen aus einem Excel-Import. Der erste Rechenschritt war die Identifizierung der mit "0" besetzten Stellen (match(0,Vektor)für den Indexvektor. Mit der Matrixmultiplikation schließlich habe ich die entsprechenden Zeilen gelöscht. Der NaN-Ansatz kam hier leider zu keinem Ergebnis, denn jede mathematische Operation mit NaN ergibt wiederum NaN. Schade eigentlich. MfG Smucums ------------------ „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Edward A. Murphy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |