2016-03-23 3 views
0

Мы приведены четыре очка, предполагается, что можно заказать:оптимизация линейной системы inequalites

A = sort(randn(1,4)) 

Я хочу, чтобы найти максимально возможное количество x в интервале 0<x<1 таким образом, что

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

Некоторые примеры:

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 

Можете ли вы предложить компактный код для выполнения этой работы, без необходимости перечислять все возможные сценарии с помощью операторов if?

+0

Можете ли вы объяснить, второй ряд? Откуда приходит 1? – Daniel

+0

максимальное значение 0 0.1353, поэтому ответ равен x = 1 –

+1

x = 0 в строке 4 нарушает логическое условие. – Leo

ответ

0

Пробуя сделать это без инструкций if, я обнаружил, что читаемость кода значительно уменьшилась. Обратите внимание, что в приведенном ниже коде есть только один оператор if, тогда как для логических сравнений можно заменить несколько других операторов if.

Все ваши тесты проходят, и код остается очень кратким (9 строк без комментариев и цикл по всем тестам).

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 

Выход:

x = 

    0.3004 


x = 

    1 


x = 

    0.1000 


x = 

    0 


x = 

    1 
Смежные вопросы