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

Einzelne Werte der Matrix ändern

 

lunatik
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2008, 16:27     Titel: Einzelne Werte der Matrix ändern
  Antworten mit Zitat      
Wie kann ich in einer Matrix auf die Einzelnen Werte zugreifen?
wenn ich also z.B.
abs(diff(M))<2 vergleiche, will ich,dass in dem Fall dann der zweite Wert aus der Folgedifferenz dem ersten gleichgesezt wird.

Wär super dankbar, wenn's mir jemand erklären könnte!
Private Nachricht senden Benutzer-Profile anzeigen


dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2008, 19:41     Titel:
  Antworten mit Zitat      
Hallo,

dein Ausdruck erzeugt dir ein logisches Array. Du kannst die Werte dann direkt mit
Code:
abgreifen. Für dein Beispiel:
Code:
M = magic(7);
idx1 = abs(diff(M))<2; % Indizes für die abs(diff(M))<2 gilt (oberen Elemente)
idx2 = [false(1,size(M,2));idx1]; % Indizes um 1 nach unten verschoben
idx1 = [idx1; false(1,size(M,2))]; % Größe korrigieren (wegen diff)
M(idx1) = M(idx2); % Überschreiben der Werte


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
lunatik
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2008, 13:15     Titel:
  Antworten mit Zitat      
Hallo

vielen Dank für die Antwort!

jetzt hab ich ein weiteres kleines Problem:
Meine Matrix sieht in etwa so aus:
5.0000 6.0000
5.3000 7.0000
5.3000 8.0000
2.4000 9.0000
2.2300 10.0000
2.4100 11.0000
1.9800 12.0000
hierbei ist die zweite achse, die Zeitachse. Die soll natürlich erhalten bleiben.

des Weiteren, bei den Zeilen
idx2 = [false(1,size(M,2));idx1]; % Indizes um 1 nach unten verschoben
idx1 = [idx1; false(1,size(M,2))]; % Größe korrigieren (wegen diff)

hab ich nicht ganz verstanden, was "size" bedeutet und, ob (M,2) dann in (M,1) verändert werden soll, fall die Vergleichszahl "1" wird?
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2008, 13:54     Titel:
  Antworten mit Zitat      
Hallo,

size ist ein MATLAB-Befehl und gibt dir die Größe der Matrix an, d.h. Anzahl der Zeilen x Anzahl der Spalten (bzw. für jede Dimension die Anzahl der Einträge).

Code:
idx1 = abs(diff(M))<2;
hier werden alle Indizes zurückgegeben, für die gilt dass abs(diff(M)) < 2. Allerdings fehlt eine Zeile, weil der Differenzoperator ja eine Zeile weglässt. Diese Zeile wird mit
Code:
idx2 = [false(1,size(M,2));idx1];
wieder hinzugefügt, und zwar am Anfang, somit erhälst du immer dann eine 1 an der Stelle (i,j), wenn abs(M(i,j)-M(i-1,j)) < 2 ist. Jetzt brauchst du natürlich noch die Indizes der Elemente, die überschrieben werden sollen. Diese sind genau um 1 im Zeilenindex inkrementiert im Vergleich zu idx2, bzw. sind genau gleich idx1. Damit die Dimensionen der Wertezuweisung stimmen, wird dann zum Schluss nochmal eine Zeile hinzugefügt
Code:
Das hier ist diese Zeile.
Zum Schluss werden die Werte der Matrix dann noch überschrieben.

Falls du das ganze nur auf eine Spalte anwenden willst, ändert sich der Code ein wenig:
Code:
M = magic(7);
N = 1; % 1. Spalte
idx1 = abs(diff(M(:,N)))<2;
idx2 = [false(1,size(M(:,N),2));idx1]; % Indizes um 1 nach unten verschoben
idx1 = [idx1; false(1,size(M(:,N),2))]; % Größe korrigieren (wegen diff)
M(idx1,N) = M(idx2,N); % Überschreiben der Werte


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
lunatik
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2008, 16:51     Titel:
  Antworten mit Zitat      
ok.. ich habe mein Problem wohl nicht ganz klar ausgedrückt:
das hier ist z.B. die Matrix:

TEST =

5.0000 5.1000
6.0000 5.0000
7.0000 5.3000
8.0000 2.3000

dann kommt der Code:

>> N = 1; % 1. Spalte
>> idx1 = abs(diff(TEST(:,N)))<2;
>> idx2 = [false(1,size(TEST(:,N),2));idx1]; % Indizes um 1 nach unten verschoben
>> idx1 = abs(diff(TEST(:,N)))<2;
>> TEST(idx1,N) = TEST(idx2,N); % Überschreiben der Werte
>> TEST(idx1,N) = TEST(idx2,N) % Überschreiben der Werte

das bekomme ich daraus:

TEST =

7.0000 5.1000
8.0000 5.0000
8.0000 5.3000
8.0000 2.3000

Aber eigentlich bräuchte ich:

TEST =

5.0000 5.1000
5.0000 5.1000
5.0000 5.1000
8.0000 2.3000

somit würden die Werte, die sich von den vorherigen um weniger, als 2 unterscheiden gleich den vorherigen.

Ganz perfekt wäre mein Problem gelöst, wenn die Werte nicht bloß um einen "nach links" (in dem Fall "nach oben") verschoben würden, sondern, wenn ich stattdessen den Mittelwert hätte.
Für mein Bsp hier:

aus

5.0000 5.1000
6.0000 5.0000
7.0000 5.3000
8.0000 2.3000

würde:

6.0000 5.2000
8.0000 2.3000

D.h. also, aus den naheliegenden Werten würde der Mittelwert gebildet und zeitlich auch in die Mitte gesetzt. Geht das irgendwie?

Mir ist wohl klar, dass das zwei völlig unterschiedliche Problemstellungen sind. Ich weiss halt selbst noch nicht genau, was besser ist und will verschiedenes ausprobieren.
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 - 2024 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.