|
|
Matrix... Adressierung etc. |
|
Programmiernull |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 04.02.2011, 15:03
Titel: Matrix... Adressierung etc.
|
 |
Hallo,
ich habe folgende Probleme:
1. Ich kann nicht programmieren.
2. Ich muss aber.
3. Zum eigentlichen Problem... Ich habe ein bitmap (Graustufen). Bisher habe ich es geschafft, die Grauwerte in eine Matrix aus 600 Zeilen und 800 Spalten zu lesen und die Werte ins double-Format zu konvertieren. Jetzt möchte ich diese Matrix in s Spaltenvektoren (s=Anzahl der Spalten) mit dem jeweiligen Namen M_i aufteilen, was vermutlich mit einer for-Schleife funktioniert, etwa so:
Man erkennt, wie wenig Plan ich habe. Braucht man irgendeinen print/fprint/sprint/wasweißich-Befehl, um fortlaufende Matrizennamen M_i zu vergeben?
Für Anregungen wäre ich äußerst dankbar.
[/code]
|
|
|
|
|
_Peter_ |

Moderator
|
 |
Beiträge: 537
|
 |
|
 |
Anmeldedatum: 08.12.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: 7.10, 2010a
|
 |
|
|
 |
|
Verfasst am: 04.02.2011, 15:18
Titel:
|
 |
Hallo Programmiernull,
Zitat: |
ich habe folgende Probleme:
1. Ich kann nicht programmieren.
2. Ich muss aber.
|
Danke, ich musste echt lachen. Sehr schön formuliert.
Zu 3.
Benutze Indexierung. Das ist wesentlich einfacher zu handhaben, als das was du vorhast.
Somit hast du alle Spaltenvektoren in column_values stehen und kannst ganz einfach wie folgt drauf zugreifen:
Ich hoffe, dass hilft dir weiter.[/quote]
_________________
Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
|
|
|
Ajax |

Forum-Century
|
 |
Beiträge: 176
|
 |
|
 |
Anmeldedatum: 09.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 04.02.2011, 15:24
Titel:
|
 |
Hallo,
vielleicht ist hier eine Gegenfrage angebracht: Warum willst du denn deine Matrix aufteilen bzw. was willst du im Anschluss mit den einzelnen Vektoren machen? Ich bin mir fast sicher, das es geschickter ist die Matrix "in einem Stück" zu lassen und lieber per Index auf die entsprechende Zeile bzw. Spalte zuzugreifen. So viele Vektoren sind auf jeden Fall sehr unhandlich.
mfg
|
|
|
Programmiernull |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 04.02.2011, 16:04
Titel:
|
 |
@ _Peter_:
Ich hab das gerade probiert, aber ich bekomme folgende Fehlermeldung:
[color=red]??? In an assignment A(I) = B, the number of elements in B and I must be the same.[color=red]
@Ajax: Da könntest du recht haben... also ich möchte die Grauwertmatrix umwandeln, so dass nur noch diejenigen Elemente drin bleiben, die über einem Schwellwert liegen. Alle anderen Werte sollen 0 sein. Dann möchte ich denjenigen Spaltenvektor finden, der die meisten von 0 verschiedenen Elemente hat - also konkret, genau die Spalte des Bitmap-Bildes, in der die meisten Werte > w_schwell stehen.
Ich hoffe das war verständlich ausgedrückt...
|
|
|
_Peter_ |

Moderator
|
 |
Beiträge: 537
|
 |
|
 |
Anmeldedatum: 08.12.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: 7.10, 2010a
|
 |
|
|
 |
|
Verfasst am: 04.02.2011, 16:40
Titel:
|
 |
Da hatte ich einen gravierenden Denkfehler, tut mir leid.
Das funktioniert nicht weil in dem Fall die Dimensionen nicht passen. Es soltle die Komplette Spalte (nehmen wir an 10 Werte) column_values(1) zugeordnet werden, die natürlich nur eine Zahl in der Form beherbergen kann. Tut mir leid.
Und Ajax hat recht, ich hätte nachfragen sollen.
Du kannst folgendes nutzen:
Alternativ kannst du auch direkt die Werte über dem Schwellwert zählen
Aber du musst dir Gedanken machen was passieren soll wenn in mehrern Spalten die gleiche Anzahl ist.
_________________
Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
|
|
|
Ajax |

Forum-Century
|
 |
Beiträge: 176
|
 |
|
 |
Anmeldedatum: 09.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 04.02.2011, 16:46
Titel:
|
 |
|
 |
|
EDIT: _Peter_ war schneller... Trotzdem lasse ich meine Antwort mal stehen.
Hallo,
also ein einfacher Weg um alle Elemente kleiner als ein Schwellenwert gleich 0 zu setzen ist über logische Indizierung - Beispiel:
gegeben sind "matrix" und "schwellenwert"
Jetzt stehen in "matrix" nur noch die Werte, welche größer als "schwellenwert" sind. Der Rest ist 0.
Mit der Funktion find() können alle Elemente in einer Matrix gefunden werden, welche ungleich 0 sind - also genau das, was du suchst.
Ein einfaches (aber langsames!) Beispiel für die Suche der Werte pro Spalte könnte dann wie folgt aussehen:
In der Zeile "ungleich_null = find(matrix(:,spalte));" werden alle Werte gesucht, die in der entsprechenden Spalte ungleich 0 sind. Die nächste Zeile berechnet die Anzahl der Werte und schreibt sie in einen Vektor "anzahl_in_spalte", an der Position der aktuellen Nummer der Spalte. Die letzte Zeile des Codes sucht schließlich nach dem maximalen Wert in diesem Vektor und gibt die Position aus. Diese Position entspricht der Spalte, in der die meisten Werte ungleich 0 stehen.
Ich hoffe ich habe es nicht zu umständlich erklärt. Es gibt sicher noch einfachere Möglichkeiten - und vor allem schnellere (hier kann dir Jan sicher weiter helfen). Aber nachdem du so schön geschrieben hast, dass du nicht programmieren kannst dachte ich ein etwas übersichtlicher Code ist hier vielleicht besser als ein schneller.
mfg
|
|
|
Sco |

Forum-Meister
|
 |
Beiträge: 699
|
 |
|
 |
Anmeldedatum: 15.08.10
|
 |
|
 |
Wohnort: Dundee
|
 |
|
 |
Version: 2008a, 2010a
|
 |
|
|
 |
|
Verfasst am: 04.02.2011, 20:18
Titel:
|
 |
Hallo,
Zitat: |
Es gibt sicher noch einfachere Möglichkeiten - und vor allem schnellere (hier kann dir Jan sicher weiter helfen).
|
Die gibt es in der Tat und der Jan weiss sie auch ganz sicher, aber wir wollen ihm ja nicht alles aufbrummen .
MFG
Sco
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 05.02.2011, 02:36
Titel:
|
 |
Hallo Sco,
Brumm, brumm. :-)
Dein Code liefert in "idx" eine Liste der Spalten, die die meisten Nicht-Nullen enthält. Der OP fragte nach der Spalte. Falls wirklich nur eine einzige gewollt ist, auch wenn es mehrere Spalten mit der gleichen Anzahl gibt:
Ich habe beim SUM-Befehl noch die Dimension mit angegeben, damit es auch für ein Bild mit nur einer Spalte das gewünschte Ergebnis liefert. Das ist zwar ein recht pathologisch Bild, aber es kann hilfreich sein, die Dimension immer genau anzugeben, um einen Algorithmus kugelsicher zu machen.
Gruß, Jan
|
|
|
Sco |

Forum-Meister
|
 |
Beiträge: 699
|
 |
|
 |
Anmeldedatum: 15.08.10
|
 |
|
 |
Wohnort: Dundee
|
 |
|
 |
Version: 2008a, 2010a
|
 |
|
|
 |
|
Verfasst am: 05.02.2011, 04:23
Titel:
|
 |
Hallo Jan,
Zitat: |
Der OP fragte nach der Spalte. Falls wirklich nur eine einzige gewollt ist, auch wenn es mehrere Spalten mit der gleichen Anzahl gibt:
|
Aber woher soll ich denn wissen welche Spalte die richtig ist? Wer sagt mir denn, dass die "erste Spalte von links" die gewünschte ist, welche ja
ausgibt?
Zitat: |
Ich habe beim SUM-Befehl noch die Dimension mit angegeben, damit es auch für ein Bild mit nur einer Spalte das gewünschte Ergebnis liefert. Das ist zwar ein recht pathologisch Bild, aber es kann hilfreich sein, die Dimension immer genau anzugeben, um einen Algorithmus kugelsicher zu machen.
|
Nur der Interesse halber, kannst du mir ein Beispiel geben wo dies wirklich entscheident ist (mit ähnlichen Vorgaben wie in dem hier genannten Beispiel)?
MFG
Sco
|
|
|
Ajax |

Forum-Century
|
 |
Beiträge: 176
|
 |
|
 |
Anmeldedatum: 09.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.02.2011, 11:47
Titel:
|
 |
Puh, Samstag früh bin ich noch nicht ganz fit - und hab grad auch kein Matlab zum testen. Aber eine Frage hätte ich jetzt auch noch an euch beide:
Mit der Zeile "sum(test ~= 0);" erfolgt eine Addition der Werte in den Spalten - soweit so klar. ABER: es soll ja nicht der maximale Wert der Spaltensumme ermittelt werden, sondern die Spalte mit den meisten von 0 verschiedenen Elementen. Das muss logischerweise nicht die selbe Spalte sein, wie die mit der höchsten Zahl. Beispiel:
Der größte Wert steht an zweiter Stelle, die maximale Anzahl der Werte ungleich 0 jedoch an erster Stelle.
Vielleicht stehe ich auch grad auf dem Schlauch - wie gesagt, Samstag früh...
mfg
|
|
|
Sco |

Forum-Meister
|
 |
Beiträge: 699
|
 |
|
 |
Anmeldedatum: 15.08.10
|
 |
|
 |
Wohnort: Dundee
|
 |
|
 |
Version: 2008a, 2010a
|
 |
|
|
 |
|
Verfasst am: 05.02.2011, 17:05
Titel:
|
 |
Hallo Ajax,
ist die Spaltensumme der Elemente die NICHT Null sind:
Denke jetzt sollte es klar sein.
MFG
Sco
|
|
|
Ajax |

Forum-Century
|
 |
Beiträge: 176
|
 |
|
 |
Anmeldedatum: 09.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.02.2011, 17:13
Titel:
|
 |
Du hast natürlich recht. Ich rede mich einfach auf "Samstag früh - viel zu früh..." raus
Gute Lösung von euch!
mfg
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 06.02.2011, 02:53
Titel:
|
 |
|
 |
|
Hallo Sco,
Zitat: |
Zitat: |
Der OP fragte nach der Spalte. |
Aber woher soll ich denn wissen welche Spalte die richtig ist? |
Genau, das meinte ich. Programmiernull fragte nach "der Spalte" mit dem größten Wert, Du hast aber viel allgemeiner gleich die "Liste der Spalten" erzeugt. Dies muss dann aber im Porgramm berücksichtigt werden, sollte es aber auch.
Zitat: |
Zitat: |
Ich habe beim SUM-Befehl noch die Dimension mit angegeben |
Nur der Interesse halber, kannst du mir ein Beispiel geben wo dies wirklich entscheident ist? |
Für die Daten aus diesem Thread ist das natürlich nur für Bilder mit 0 oder einer Spalte wichtig - also nur für exotische Ausnahmen. Es ist aber im Allgemeinen immer sicherer, bei der Verwendung eines Befehls nicht eine bestimmte Größe der zu bearbeitenden Daten vorauszusetzen. So ist "sum(x)" zwar wirklich hübsch, wenn man einen Vektor summieren möchte und damit Zeilen- und Spalten-Vektoren gleichzeitig bearbeiten kann. Aber die Aussage "sum(A) berechnet die Spalten-Summe für eine beliebige Matrix A" ist nicht korrekt, da halt auch "1:2" eine Matrix ist.
Noch weiter verallgemeinert kann man die Zuverlässigkeit eines Programms dadurch erhöhen, dass die Programmstruktur und Besonderheiten der Daten streng voneinander trennt.
Gruß, Jan
|
|
|
Sco |

Forum-Meister
|
 |
Beiträge: 699
|
 |
|
 |
Anmeldedatum: 15.08.10
|
 |
|
 |
Wohnort: Dundee
|
 |
|
 |
Version: 2008a, 2010a
|
 |
|
|
 |
|
Verfasst am: 06.02.2011, 03:08
Titel:
|
 |
Hallo Jan,
Danke für die Erklärung, wobei sich mir nicht erschließt was Bilder mit 0 Spalten sind? Für mich ist dies ein leerer Vektor (Matrix).
MFG
Sco
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 06.02.2011, 19:41
Titel:
|
 |
Hallo Sco,
Das stimmt. Ein Bild ohne Spalten ist ein leeres Array. Und ein Programm ist dann stabil, wenn es auch leere und degenerierte (also Arrays mit einer oder mehreren Dimensionen der Länge 1) Arrays verkraftet. Auch Inf's und NaN's sollten als Input entweder entsprechend sinnvolle Ergebnisse liefern oder zumindest mit einen Error erzeugen - und nicht heimlich falsche Ergebnisse produzieren.
Gruß, Jan
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|