Matlab - реляционные матрицы?

У меня есть вектор координат с именем x. Я хочу получить элемент(ы) с минимальной координатой y:

a = find(x(:,2)==min(x(:,2))); % Contains indices

Это возвращает индексы элементов с наименьшими координатами y. Я говорю element*s*, ​​потому что иногда это возвращает более 1 значения (например, (10,2) и (24,2) оба имеют 2 в качестве координаты y, и если 2 является минимальной координатой y. ..).

В любом случае, мой следующий шаг — отсортировать (по возрастанию) элементы с минимальными координатами y в соответствии с их координатами x. Сначала я делаю:

b = sort(x(a,1));

Вышеупомянутая операция может переставить элементы с минимальными координатами y, поэтому я хочу применить эту перестановку и к a. Итак, я делаю:

[v i] = ismember(b, x(:, 1));

К сожалению, если есть элементы с одинаковым значением x, но разными значениями y, и один из этих элементов оказывается членом a (т.е. b), то матрица выше выбирает его. Например, если (10,2) и (24,2) являются элементами с наименьшими координатами y и есть третий элемент (24, 13), то это испортит описанную выше операцию. Есть ли способ лучше? Я написал свой скрипт, используя циклы, и все было хорошо, но в соответствии с методологией Matlab я переписал его, и я боюсь, что мое незнание Matlab вызывает эту ошибку.


person s5s    schedule 13.05.2012    source источник


Ответы (1)


Извините, возможно, я неправильно понял ваш вопрос, но позвольте мне перефразировать то, что, как я думаю, вы хотите здесь: у вас есть набор 2D-координат:

x = [24,2; 10,2; 24,13];

Вы хотите, чтобы пары координат оставались вместе (24,2) (10,2) и (24,13). И вы хотите найти пары координат с минимальной координатой y, и если их несколько, то вы хотите отсортировать их по координате x. И вам нужны индексы строк того, какими были эти пары координат в исходной матрице x. Другими словами, вам нужен окончательный ответ:

v = [10,2; 24,2];
i = [2,1];

Если я правильно понял, то сделать это можно так:

(Примечание: я изменил x на еще одну пару (40,13), чтобы проиллюстрировать разницу между idx(i) и i)

>> x = [40,13; 24,2; 10,2; 24,13];
>> idx = find(x(:,2)==min(x(:,2))) %Same as what you've done before.

idx =

     2
     3

>> [v,i] = sortrows(x(idx,:)) %Use sortrows to sort by x-coord while preserving pairings

v =

    10     2
    24     2


i = % The indices in x(idx,:)

     2
     1

>> idx(i) %The row indices in the original matrix x

ans =

     3
     2

И, наконец, если это не то, что вы хотели, можете ли вы указать, каким, по вашему мнению, должен быть ваш ответ [v,i] в приведенном вами примере?

person kitchenette    schedule 13.05.2012
comment
Это как раз моя цель. Также вы можете сделать это с помощью sort (поскольку мы уже отсортировали значения y): [v i] = sort(x(idx,1)); идентификатор (я); :). - person s5s; 14.05.2012