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

Bestimmte Werte mit Positionsangabe aus Matrix rausschreiben

 

Guardian
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2013, 15:12     Titel: Bestimmte Werte mit Positionsangabe aus Matrix rausschreiben
  Antworten mit Zitat      
Liebe Matlabveteranen Wink

ich habe eine ixj-Matrix mit Werten zwischen 0 und 10.
z.b. so
Code:
>> A=[7.2 1.0 0 3.2 8.1 10; 10 5.4 4.0 1.1 4.5 6.8; 10 5.2 4.1 1.7 4.9 6.0; 9.1 2.6 4.5 8.3 7.5 3.1; 5.7 9.1 9.1 2.9 0 6.2; 2.2 10 4.2 6.6 7.4 7.8; 8.7 8.3 7.3 6.5 4.3 8.2]

A =

z7    7.2000    1.0000         0    3.2000    8.1000   10.0000
z6   10.0000    5.4000    4.0000    1.1000    4.5000    6.8000
z5   10.0000    5.2000    4.1000    1.7000    4.9000    6.0000
z4    9.1000    2.6000    4.5000    8.3000    7.5000    3.1000
z3    5.7000    9.1000    9.1000    2.9000         0    6.2000
z2    2.2000   10.0000    4.2000    6.6000    7.4000    7.8000
z1    8.7000    8.3000    7.3000    6.5000    4.3000    8.2000
       s1          s2     s3             s4         s5       s6
 

Die Nummerierung von Zeilen und Spalten soll entsprechend so aussehen.

Nun möchte ich werte rausschreiben lassen, die die folgenden kriterien erfüllen:
- größer als 7.0
- Zeilen zu Spaltendifferenz kleiner als 4
- nur ein Wert pro Zeile und Spalte, und zwar der jeweils größte.
-> falls gleich große Werte vorhanden sind, dann der mit der geringsten Zeilen-Spaltendifferenz

Insgesamt sollen dann die drei größten Werte genommen werden, die die oben genannten Kriterien alle erfüllen.
Ausgegeben werden soll jeweils die Position des Wertes in der Matrix (Zeile und Spalte).
Am Beispiel der Matrix A von oben würde dann etwas in der Form herauskommen:

10.0000, z7, s6
10.0000, z2, s2
9.1000, z3, s3

Das ganze soll als Funktion aufgebaut sein, die mir nach dem Einlesen der Matrix, die Position der 3 Werte ausgibt.

Mein Ansatz sieht so aus
Code:
function x = getValues(A)
  x = [];
  for i = 1:size(A,1)
    for j = 1:size(A,2)
   value = A(i, j);
   if ((abs(i - j) < 4) && (value > 7))
     Result=append(x, [i, j]);
   end
 end
  end
end

Allerdings weder vollständig noch funktionsfähig. Sad
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2013, 20:02     Titel:
  Antworten mit Zitat      
Hallo Guardian,

was hindert Dich daran, die Funktion vollständig zu machen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Guardian
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2013, 22:17     Titel:
  Antworten mit Zitat      
fehlendes wissen Sad ich habe gerade erst mit matlab angefangen.
ich weiß nicht wo der fehler liegt und ich weiß auch nicht wie ich die 3. Bedingung (nur ein wert pro zeile und spalte) umsetze. aber ich lerne jeden tag etwas dazu und frage hier nur wenn ich am rand der verzweiflung stehe. Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Guardian
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2013, 20:41     Titel:
  Antworten mit Zitat      
ich habs jetzt über einen anderen weg versucht

Code:
function [ zeile,spalte,wert ] = lol( A )

[i,j]=find(A>=9);

groesse=size(i,1);

for (x=1:1:groesse)
wert=A(i(x),j(x));
zeile=i(x);
spalte=j(x);
fprintf('%d.Treffer\nzeile= %d\nspalte= %d\nwert= %d\n\n',x,zeile,spalte,wert);
end
end

das schreibt mir quasi die werte mit zeile und spalte raus.
allerdings weiß ich nicht wo ich die bedingung
Code:
zeilenspaltendifferenz=abs(i-j)<4
einbaue?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.10.2013, 21:00     Titel:
  Antworten mit Zitat      
Hallo,

ich vermute, dass die Frage leicht zu beantworten wäre, wenn sie mir klar wäre.
Was bedeutet "Zeilen zu Spaltendifferenz kleiner als 4"?
Was ist eine "Zeilen-Spaltendifferenz"?

Für solche Fragen sind typischerweise auch keine Schleifen nötig, man kann hierfür logische Indizierung verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Guardian
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2013, 21:03     Titel:
  Antworten mit Zitat      
die zeilennummer und spaltennummer
1. zeile
2. zeile
..

1. spalte
2. spalte
...

es soll also z.b. kein wert genommen werden der in (5,1) liegt, da 5-1=4
Private Nachricht senden Benutzer-Profile anzeigen
 
Guardian
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.10.2013, 16:00     Titel:
  Antworten mit Zitat      
Ich habe das gröbste nun gelöst.
Ich bin etwas strukturierter vorgegangen und packte das Problem in Schritten an:

Matrix A ist die Startmatrix

Code:
function [w,n,m]= kriterium(A)
% Schritt 1:
% Matrix A -> Zeile-Spalte<4 -> Neue Matrix: B
for i=1:size(A,1)
    for j=1:size(A,2)
        if abs(i-j)<=3
            B(i,j)=A(i,j);
        else
            B(i,j)=0;
        end
    end
end

% Schritt 2:
% größter Wert je Zeile abfragen und übernehmen, alles andere 0
% -> Matrix C
p=max(B,[],2);
for i=1:size(B,1)
    for j=1:size(B,2)
        if p(i)== B(i,j)
            C(i,j)=B(i,j);
        else
            C(i,j)=0;
        end
    end
end

% Schritt 3:
% größter Wert je Spalte abfragen und übernehmen, alles andere 0
% -> Matrix D
q=max(B,[],1); % HIER STEHT ABSICHTLICH B, da sonst gekillte Werte aus B nicht berücksichtigt werden
for i=1:size(C,1)
    for j=1:size(C,2)
        if q(j)== C(i,j)
            D(i,j)=C(i,j);
        else
            D(i,j)=0;
        end
    end
end
A
B
C
D
% Schritt 4:
% Werte > 7 speichern mit zeile und spalte
[n,m]=find(D>7);
n
m
wert=D(n,m);
w=diag(wert)

???



Matrix D erfüllt dann die 2 Bedingungen
- Zeilen-Spalten-Abstand <4
- Nur ein Wert pro Zeile und Spalte, jeweils der größte

Die Werte >7 werden auch ausgelesen.

jetzt brauche ich noch die Möglichkeit die besten 3 Werte von w auszuwählen und davon dann die korrekten n und m zu übernehmen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Bea

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2017, 16:52     Titel: Wenn dann Abfrage in Matrix: if in Spalte A und in Spalte B
  Antworten mit Zitat      
Hallo,

ich versuche sowas ähnliches- aber doch anders:
- Zeile übernehmen wenn in Spalte A ein bestimmter Wert steht. --> Neue Matrix die nur die Zeilen enthält die in Spalte A die Beschriftung "OK" tragen.

-Mein Gebilde sieht ungefähr so aus- die Aufgabe klingt nach Excel- aber meine Tabelle ist RIESIG und Excel schafft das nicht.
Ich habe ein MatlabProgramm das die hier zu erzeugenend Tabelle einlesen kann- aber anstelle von "avg" schreiben darf auch gleich der Mittelwert all dener bestimmt warden die diese Bedingung erfüllen.

Ausgangsmatrix M1

Name | No| Zusatz|
A | 1 | b |
A | 2 | c |
A | 3 | b |
A | 4 | c |
B | 1 | b |
B | 2 | b |

Ergebnismatrix M2
Name | No| Zusatz|Ergebnis
A | 1 | b | avg ( =WENN Name =A und Zusatz b dann Ausgabe "avg")
A | 2 | c | 0
A | 3 | b | avg
A | 4 | c | 0
B | 1 | b | 0
B | 2 | b | 0


Vielen Dank für Eure Hilfe!

Viele Grüße,

Bea
 
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.