Eigene Norm in Matlab schreiben

Neue Frage »

steviehawk Auf diesen Beitrag antworten »
Eigene Norm in Matlab schreiben
Meine Frage:
Hallo Leute, ich möchte gerne eine eigene Matlabfunktion mynorm schreiben, die die gleiche Funktion erfüllt wie die interne norm Funktion. Aber ich habe noch so meine Probleme.

Meine Ideen:
Ich dachte mir das so:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 function mynorm = mynorm(A,i)

for i = 2
    
    mynorm = A;
    
end

for i = 3
    
    mynorm = A';
    
end




Mir ist klar, dass A und A' nicht gerade Normen darstellen, aber ich wollte es mal einfach lassen zum testen des Prinzips..

Ich muss ja matlab kar machen, dass je nachdem, was man für i einsetzt mynorm eine andere Funktion hat! Wie stelle ich das an.

Danke für die Hilfe
Airblader Auf diesen Beitrag antworten »

Also von mir kommt erstmal keine weitere Hilfe, solange du es nicht für nötig hältst, in deinen anderen Threads ( Matlab Funktion in Funktion implementieren ) zu antworten.

air
Airblader Auf diesen Beitrag antworten »

Nachdem das ja nun geschehen ist (ich verlange es übrigens einfach deswegen, da ich den Thread im Auge behalte und ganz gerne eine Rückmeldung hätte, ob es denn nun geklappt hat oder nicht):

In der Regel nutzt man hierfür if-Statements. In diesem Fall noch besser wäre jedoch das switch-case-Statement.

Je nachdem, wie die konkret implementierte Norm dann schließlich aussieht, kannst du aber vielleicht sogar auf beides verzichten und deinen Parameter direkt als Parameter an Matlab weiterleiten (zum Beispiel als Parameter bei sum, der dann einfach angibt, über welche Dimension summiert wird).

Als Beispiel:
code:
1:
2:
3:
4:
5:
if myVar == 1
   myResult = sum(A, 1);
elseif myVar == 2
   myResult = sum(A, 2);
end


ist das selbe wie

code:
1:
2:
3:
4:
5:
6:
switch myVar
   case 1
      myResult = sum(A, 1);
   case 2
      myResult = sum(A, 2);
end


ist das selbe wie

code:
1:
myResult = sum(A, myVar);


Noch ein weiterer Tipp: Nenne eine Variable in Matlab bitte nicht einfach "i", da dies für die imaginäre Einheit steht. Besser ist "ii", doch das wird in der Regel für Schleifen verwendet. Richtig gut wäre es, wenn du dem Ganzen einen Namen gibst, der auch gleich anzeigt, wofür die Variable steht.

air
steviehawk Auf diesen Beitrag antworten »

Super Danke. Ich habe mich jetzt erstmal für die if - Anweisung entschieden, die kann ich am besten nachvollziehen..

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 function mynorm = mynorm(X,N) %N für Number

if N == 1
  mynorm = X;
    
elseif N == 2
    mynorm = X';
    
end
 
Airblader Auf diesen Beitrag antworten »

Für den Anfänger auch völlig in Ordnung. Langfristig wäre switch/case jedoch schon erheblich besser.
Bei der if-Anweisung solltest du folgende zwei Dinge beachten:

  • Hier musst du wirklich elseif verwenden (wie du es getan hast), nicht mehrere if-Statements. Andernfalls überschreibt jede Anweisung die vorausgehenden.
  • Bei Vergleichen immer daran denken, dass diese mit "==" gemacht werden, nicht mit "=". Bei Parametern, die übergeben werden, ist es in Matlab mitunter gar ratsam, statt "a == b" doch lieber "isequal(a, b)" zu verwenden.


air
steviehawk Auf diesen Beitrag antworten »

Ich habe noch eine Frage. Es sieht jetzt so aus:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
 function mynorm = mynorm(A,Var) %Var für Variable

function lambda = vonMises(B)   %Eingebettete Funktion, die lambdamax bestimmt

v = ones(length(B),1); %Startvektor

for n=1:(2*length(B)) %2n Iterationen

wn = v/(sqrt(v'*v));%Normierung
v = B*wn; %Iterierter Vektor
lambda = wn'*v; %bestimmt lamdamax

end
end

if Var == 1
  mynorm = max(sum(A)); %Spaltensummennorm

elseif Var == ??????
    mynorm = sqrt(vonMises(A'*A)); %Lambdamax-Norm
    
elseif Var == 2
    mynorm = sqrt(vonMises(A'*A)); %Lambdamax-Norm
    
elseif Var == Inf
    mynorm = max(sum(A,2)); %Zeilensummennorm
    
elseif Var == 'fro'
    mynorm = sqrt(sum(sum((A.^2),2))); %Frobeniusnorm
    
end
end



Ich möchte ja, dass mynorm(A,2) das gleiche ist wie mynorm(A), ich

also muss ich ja hier:

code:
1:
2:
 elseif Var == ????
    mynorm = sqrt(vonMises(A'*A)); %Lambdamax-Norm 


für die Fragezeichen irgendwie nichts einsetzen, so dass auch der Ausdruck: mynorm(A) also ohne noch was dazu Sinn macht.

Hatte es erst mit:

code:
1:
 mynorm(A) = mynorm(A,2); 
am Ende der Funktion, also nach der if - Schleifeversucht, aber das ging nicht.

Tipp vielleicht??

Danke

Und ich habe noch ein Problem:

Ich habe dieses Funktion ja jetzt so geschrieben, dass für A erstmal Matrizen eingesetzt werden sollten. Da ich ja Matrixnormen definiert habe.

Jetzt möchte ich aber so wie Matlab erkennen, wenn es sich bei A um einen Vektor handelt. Und dann entsprechende andere Normen, eben Vektornormen berechnen.

Ich dachte mir das erst so, dass ich einfach A auch als Variable definieren und dann so was habe:

code:
1:
 function = mynorm(Var1,Var2) 


jetzt wollte ich in der if - Anweisung noch sagen, dass dies nur gilt, wenn Var1 eine Matrix ist..

aber mit
code:
1:
2:
 if Var2 == 1, Var2 == Matrix
  mynorm = max(sum(A)); %Spaltensummennorm 


ging nichts.. wie sage ich Matlab, dass das nur gilt, wenn Var2 eine Matrix ist und kann ich 2 Anweisung hinter ein if schreiben? Hab es versucht, aber es klappt nicht so recht..
 
 
steviehawk Auf diesen Beitrag antworten »

Probieren geht über studieren Prost

die Funktion isvector(Var1) hilft weiter..
Airblader Auf diesen Beitrag antworten »

Zitat:
Ich möchte ja, dass mynorm(A,2) das gleiche ist wie mynorm(A)


Sicher verwirrt Sollte es nicht eher was anderes sein? Sonst wäre der Parameter ja völlig sinnlos und du könntest ihn einfach weglassen, oder?

Zitat:
also nach der if - Schleife


"if" ist eine Anweisung, keine Schleife, es wiederholt sich ja nichts.

Zitat:
und kann ich 2 Anweisung hinter ein if schreiben?


Ja, aber Matlab will natürlich schon wissen, wie die zwei Anweisungen zu verwerten sind ("und", "oder", ...). Ausführlich findest du es unter Logical Operators, aber ich nehme gleich vorweg: Verwendet am Besten die "Short Circuit Operators", also "&&" für "und" und "||" für oder:

code:
1:
if myVar1 == 1 && myVar2 == 2


.. wird ausgeführt, wenn beide Bedingungen zutreffen (die zweite wird aber nur überprüft, wenn die erste stimmt).

code:
1:
if myVar1 == 1 || myVar2 == 2


.. wird ausgeführt, wenn mindestens eine der beiden Bedingungen zutreffen (die zweite wird nur überprüft, wenn die erste nicht stimmt).

Alles andere hast du dir bereits selbst beantwortet, oder? Wenn nicht, nochmal fragen.

air
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »