2016-08-14 7 views
0

Wie kann ich meine Überprüfung verbessern (verkürzen), dass Werte echte positive ganze Zahl sind? Ich will es nur für eine ganze Zahl zuerst tun (a), für die ichÜberprüfung auf echte positive ganze Zahlen

a~=floor(a) || a<=0 || imag(a)~=0 

Zweitens versucht haben, ich möchte es für eine verkettete Liste

l=struct('xpos',value,'ypos',value,'entry',value,'next',[]) 
l=struct('xpos',value,'ypos',value,'entry',value,'next',l) 

und so weiter zu tun.

Für die Liste Ich möchte alle xpos und ypos Werte reelle positive ganze Zahlen sein, ich habe versucht,

any(l.xpos~=floor(a) || l.xpos<=0 || imag(l.xpos)~=0 || l.ypos~=floor(l.ypos) || l.ypos<=0 || imag(l.ypos)~=0) 

Dieser endet ziemlich lang sein, als ich zwei Listen hatte zu überprüfen.

Antwort

0

Sie könnten möglicherweise Ihren Scheck vereinfachen und es in eine anonyme Funktion mit so etwas wie:

isPositiveInt = @(x)isscalar(x) && isnumeric(x) && abs(round(x)) == x && x > 0; 

Wenn sichergestellt ist, dass es immer ein Skalar und numerische werden Sie dies vereinfachen:

isPositiveInt = @(x)abs(round(x)) == x && x > 0; 

Dann könnten Sie leicht diese Prüfung sowohl für xpos und ypos

isPositiveInt(S.xpos) && isPositiveInt(S.ypos) 

Um Ihre „verketteten Liste“ durchlaufen Sie eine Schleife nur durch sie benötigen

while ~isempty(S) 
    % They they are both integers do something 
    if isPositiveInt(S.xpos) && isPositiveInt(S.ypos) 
     % Do something 
    end 

    % Go onto the next one 
    S = S.next; 
end 

Als Nebennote, ist es am besten mit einem Klein l als Variable zu vermeiden, da es sich um ein aussieht viel wie die Nummer 1. Ich habe es im obigen Beispiel für S ausgeschaltet.

+0

Prüfen Sie, ob es sich um eine echte oder eine komplexe Zahl handelt. Ich sehe auch nicht die Notwendigkeit für Isscalar. –

+0

@CarlyCoop Das wird von 'abs' behandelt – Suever

+0

Würde imag nicht besser funktionieren? Und wie implementiere ich die while-Schleife als Bedingung für eine if-Anweisung? –

Verwandte Themen