2016-03-23 16 views
0

Wir sind vier Punkte gegeben, angenommen zu bestellen:Optimierung eines linearen Systems von Inequalites

A = sort(randn(1,4)) 

Ich möchte die maximal mögliche Anzahl x im Intervall finden 0<x<1 so dass

A(1)<x<A(2) or A(3)<x<A(4) 

Einige Beispiele:

A = [-1.4924 0.3004 1.6630  2.1204], x = 0.3004 
A = [-0.4754 0.1353 0.6552  1.3873]; x = 1.0000 
A = [-1.0213 -0.4521 -0.0905  0.1000]; x = 0.1000 
A = [-1.8258 -0.5790 -0.4568 -0.1950]; x = 0.0000 
A = [ 1.5000 2.0000 2.5000  3.0000]; x = 1.0000 

Können Sie einen kompakten Code vorschlagen? um diese Aufgabe zu erledigen, ohne alle möglichen Szenarien mit if Aussagen auflisten zu müssen?

+0

Können Sie die zweite Reihe erklären? Woher kommt die 1? – Daniel

+0

der maximale Wert von 0 0.1353, so ist die Antwort x = 1 –

+1

x = 0 in Zeile 4 verletzt die logische Bedingung. – Leo

Antwort

0

Nachdem ich versucht habe, dies ohne if-Anweisungen zu tun, stellte ich fest, dass die Lesbarkeit des Codes stark vermindert war. Beachten Sie, dass es im folgenden Code nur eine einzelne if-Anweisung gibt, während mehrere andere if-Anweisungen die logischen Vergleiche ersetzen könnten.

Alle Ihre Tests bestehen und der Code bleibt sehr knapp (9 Zeilen ohne die Kommentare und Schleife über alle Tests).

A = [[-1.4924 0.3004 1.6630  2.1204]; 
    [-0.4754 0.1353 0.6552  1.3873]; 
    [-1.0213 -0.4521 -0.0905  0.1000]; 
    [-1.8258 -0.5790 -0.4568 -0.1950]; 
    [ 1.5000 2.0000 2.5000  3.0000]]; 

for i = 1:size(A,1) 
    % Reshape A so that each set of 2 entries are compared 
    Atmp = reshape(A(i,:),2,2); 

    % Find any valid entries 
    Valid = Atmp > 0 & Atmp < 1; 
    Ind_Valid = find(Valid == 1); 

    if (~isempty(Ind_Valid)) 
     % If there are valid entries, return: 
     % max(A(ind),0) if the entry is the 1st of the pair 
     % max(A(ind),1) if the entry is the 2nd of the pair 
     max_Ind = max(Ind_Valid); 
     x = max(Atmp(max_Ind),mod(max_Ind,2)) 
    else 
     % If there are no valid entries, return: 
     % 0 if max A < 0 
     % 1 if max A > 1 
     x = max(Atmp(:)) > 0 
    end 
end 

Ausgang:

x = 

    0.3004 


x = 

    1 


x = 

    0.1000 


x = 

    0 


x = 

    1 
Verwandte Themen