Предоставить значение из строки, удовлетворяющей множественным условиям - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть три столбца данных в MATLAB ...

A = [ 10.0000   10.0000   22.9401;
    9.0000   11.0000  302.5402;
    9.0000   11.0000  285.7156;
    9.0000   11.0000  294.7599;
    9.0000   11.0000  301.2963;
    9.0000   11.0000  288.3905;
    9.0000   11.0000  301.0232;
    9.0000   11.0000  300.4630;
    9.0000   11.0000  287.3316;
    9.0000   11.0000  265.4248;
    9.0000   11.0000  297.4152;
   11.0000   11.0000   32.7959;
   11.0000   11.0000   32.2272;
   10.0000   12.0000  304.5999;]

Мне нужно вернуть строку, которая удовлетворяет ряду условий.

  1. Для любого строка должна быть включена, первый и второй столбцы должны быть равны.

  2. Тогда я бы хотел наибольшее значение из столбца 2.

  3. Если есть случай, когда есть два кандидата, которые удовлетворяют условиям 1 и 2, я бы хотел выбрать кандидата с наименьшим числом в столбце 3.

Так что в приведенном выше примере I хотел бы ввести матрицу данных и вернуть с 13.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Вы можете сделать это, используя в основном просто логическое индексирование

% Add a row index as a 4th column to A. 
% This is so we can track the original row number as we filter A down.
A(:,4) = (1:size(A,1)).';
% Filter A to satisfy condition (1); column 1 value == column 2 value
Afilt = A( A(:,1) == A(:,2), : );
% Filter again to leave only the rows which satisfy condition (2)
% Also sort on column 3 so that row 1 has the lowest value in column 3
Afilt = sortrows( Afilt( Afilt(:,1) == max(Afilt(:,1)), : ), 3, 'ascend' );
% Get the first value in column 4, which corresponds to the lowest value in col 3
idx = Afilt(1,4);

Вы можете сделать все это в одну строку, но это не красиво, и вы вычисляете условие 1 дважды:

[~,idx] = min( A(:,3) .* 1./(A(:,1)==A(:,2) & A(:,1)==max(A(A(:,1)==A(:,2),1))) );
1 голос
/ 11 февраля 2020

Вы можете проверить все свои условия подряд:

% First column = Second column
ind1     = find(A(:,1) == A(:,2))
% Find the maximum value from the second column that also meet the first condition
ind2     = find(A(ind1,2) == max(A(ind1,2)))
% Get the minimal value on the last column that also meet the first and second condition
[~,ind3] = min(A(ind1(ind2),3))

% Get the result
row = ind1(ind2(ind3))
...