WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrix... Adressierung etc.

 

Programmiernull

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2011, 15:03     Titel: Matrix... Adressierung etc.
  Antworten mit Zitat      
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:

Code:
for i=1:s
   M_([num2str(i)],i)=M(:,i)
end



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

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 04.02.2011, 15:18     Titel:
  Antworten mit Zitat      
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. Smile

Zu 3.
Benutze Indexierung. Das ist wesentlich einfacher zu handhaben, als das was du vorhast.

Code:

for i=1:s
   column_values(i)=M(:,i)
end
 


Somit hast du alle Spaltenvektoren in column_values stehen und kannst ganz einfach wie folgt drauf zugreifen:
Code:

column_values(1)
column_values(2)
...
column_values(s)
 


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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2011, 15:24     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Programmiernull

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2011, 16:04     Titel:
  Antworten mit Zitat      
@ _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]

Question

@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

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 04.02.2011, 16:40     Titel:
  Antworten mit Zitat      
Embarassed
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:
Code:

M(M<schwellwert) = 0; %Alle Werte unter dem Schwellwert werden durch 0 ersetzt.

for i=1:s
   columns(i) = length(M(M(:,i)>0)); %schreibt in columns(i) die anzahl der Werte über 0 in der aktuellen Spalte
end

[value, index] = max(columns); % gibt dir an welche die höchste anzahl ist(value) und in welchem index diese als erstes aufgetaucht ist.
 


Alternativ kannst du auch direkt die Werte über dem Schwellwert zählen
Code:

for i=1:s
   columns(i) = length(M(M(:,i)>schwellwert)); %schreibt in columns(i) die anzahl der werte über dem schwellwert
end
 


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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2011, 16:46     Titel:
  Antworten mit Zitat      
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"

Code:

matrix(matrix < schwellenwert) = 0;
 


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:


Code:

matrix = rand(10);
schwellenwert = 0.4;

matrix(matrix < schwellenwert) = 0;

anzahl_in_spalte = zeros(10,1);

for spalte = 1:10
    ungleich_null = find(matrix(:,spalte));
    anzahl_in_spalte(spalte) = length(ungleich_null);
end

find(anzahl_in_spalte == max(anzahl_in_spalte))
 


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 04.02.2011, 20:18     Titel:
  Antworten mit Zitat      
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 Smile.
Code:

test = round(rand(10).*10);
test(test<5) = 0; % Schwellenwert 5
test = sum(test ~= 0);
idx = find(test == max(test)); % Spaltenindizes
 


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.02.2011, 02:36     Titel:
  Antworten mit Zitat      
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:
Code:
test = round(rand(10).*10);
test(test < 5) = 0;
test = sum(test ~= 0, 1);
[num, idx] = max(test);
 

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 05.02.2011, 04:23     Titel:
  Antworten mit Zitat      
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
Code:

[num, idx] = max(test);
 

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2011, 11:47     Titel:
  Antworten mit Zitat      
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:

Code:

1 0 1
2 0 0   => Spaltensumme = [6 9 4];
3 9 3
 


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... Wink
mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 05.02.2011, 17:05     Titel:
  Antworten mit Zitat      
Hallo Ajax,

Code:

sum(test ~= 0)
 

ist die Spaltensumme der Elemente die NICHT Null sind:
Code:

test        (test~=0)            sum(test=~0,1)

1 0 1         1 0 1
2 0 0   =>    1 0 0  => summe  =   [3 1 2]
3 9 3         1 1 1
 


Denke jetzt sollte es klar sein.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2011, 17:13     Titel:
  Antworten mit Zitat      
Du hast natürlich recht. Ich rede mich einfach auf "Samstag früh - viel zu früh..." raus Wink
Gute Lösung von euch!
mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.02.2011, 02:53     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 06.02.2011, 03:08     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.02.2011, 19:41     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.