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
fehlendes wissen 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.
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.
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) ifabs(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.
Bea
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 17.08.2017, 16:52
Titel: Wenn dann Abfrage in Matrix: if in Spalte A und in Spalte B
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
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
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.