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

Abfrage ob Vektorelement in Matrix vorhanden -> Matrixupd

 

sarah88
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 13.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2016, 18:42     Titel: Abfrage ob Vektorelement in Matrix vorhanden -> Matrixupd
  Antworten mit Zitat      
Hi,

ich habe eine Frage:

Ich habe einen Zeilenvektor mit 3 Elementen und eine 10x3 Matrix.

Nun möchte ich den ersten Wert des Vektors mit den Werten in der ersten Spalte der Matrix vergleichen.

Es soll eine Abfrage stattfinden, welche prüft, ob das erste Vektorelement bereits in dieser Matrix vorhanden ist oder nicht.

Ist es vorhanden, so soll die Zeile in der Matrix mit dem kompletten, neuen Zeilenvektor überschrieben werden. Der alte Wert interessiert erstmal nicht mehr.

Ist es nicht vorhanden, so soll der neue Zeilenvektor in eine Zeile eingefügt werden, welche leer bzw. an erster Stelle keinen Wert außer Null hat bzw. gleich [0 0 0] ist.


Mein bisheriger Code:
Code:

v1 = [15 20 20]; %Testvektor 1
v2 = [11 50 50]; %Testvektor 2

m = [1 10 10; 2 10 10; 3 10 10; 8 10 10; 15 18 18; 0 0 0; 10 10 10; 20 10 10; 16 10 10; 19 10 10]; %Zu prüfende Matrix

zeilenindex = 0;

%An dieser Stelle weiß ich nicht weiter, ich weiß aber dass man einen Zeilenindex einführen muss, welcher mithilfe einer for-Schleife die Vergleiche mitzählt. Scheitert ein Vergleich, so steigt der Zeilenindex um 1 und die Schleife geht von vorne los.

%Bei Testvektor 1 muss ein Vorhandensein erkannt werden und die Zeile aktualisiert werden
%Bei Testvektor 2 muss eine freie Stelle in der Matrix gefunden und der neue Vektor eingefügt werden.

%Rückgabewert der Funktion muss die Position des neuen Vektors in der Matrix sein!!

 


Danke für jegliche Hilfe und Grüße

eure Sarah
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.01.2016, 21:49     Titel:
  Antworten mit Zitat      
Hallo,

die Suche geht recht einfach mit dem find Befehl:

Code:

Index = find(m(:,1) == v1(1));

if ~isempty(Index)
   m(Index,:) = v1; % hier im Bsp. wird die 5. Zeile in M durch v1 ersetzt
end
 


Jetzt musst du dir noch überlegen, was passiert wenn eine Spalte in m den gesuchten Wert mehrmals enthält. Dann ist Index ja kein Skalar, sondern ein Vektor. Man könnte das dann z.B. mit einer Schleife lösen.

Zitat:
Bei Testvektor 2 muss eine freie Stelle in der Matrix gefunden und der neue Vektor eingefügt werden.


Was ist für dich eine freie Stelle in m? Prinzipiell könnte man v2 in jeder Zeile einfügen.
Private Nachricht senden Benutzer-Profile anzeigen
 
sarah88
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 13.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2016, 23:05     Titel:
  Antworten mit Zitat      
Hi, danke für deine Antwort!

Mit freier Stelle meine ich in der Matrix z.B. [...;0 0 0;....]. Quasi ein freier Platz zum belegen, da v1[1] ja nirgendwo anders vorkommt und auch mit in die Matrix aufgenommen werden soll.

Die freien Plätze, also alle mit einer Null in Spalte 1, kann ich ja ebenfalls mit dem find-Befehl ausfindig machen und den erstbesten nehmen.

Dass in der Matrix ein Spaltenwert mehr als einmal vorkommt ist unwahrscheinlich, da die Matrix zu Beginn mit lauter Nullen initialisiert ist. Aber du hast natürlich recht, das muss alles in Form einer Schleife einsortiert werden, da sonst Werte doppelt gespeichert werden könnten.
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: 20.01.2016, 13:28     Titel:
  Antworten mit Zitat      
Hallo Sarah,

Noch eine Vereinfachung:
Code:
Index = find(m(:,1) == v1(1) || m(:,1) == 0, 1);
m(Index, :) = v1;

Dies sucht nach dem ersten Vorkommen einer passende Zahl oder einer 0.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
sarah88
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 13.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2016, 18:45     Titel:
  Antworten mit Zitat      
OK danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.