2012-05-13 2 views
0

У меня есть вектор координат, называемый x. Я хочу, чтобы получить элемент (ы) с мин у координат:Matlab - реляционные матрицы?

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

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

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

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

выше операция может переставить элементы с мин у координат, поэтому я хочу, чтобы применить эту перестановку к а. Так что я:

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

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

ответ

1

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

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

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

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

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

(Примечание: Я изменил х, чтобы иметь еще одну пару (40 , 13), чтобы проиллюстрировать разницу между IDX (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] должны быть в пример, который вы дали?

+0

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

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