matlab/octave сравнивает векторы, используя порядок словаря?

Есть ли в Octave краткий способ сравнить два вектора, используя порядок словаря (лексикографический)?

т.е. я хотел бы сравнить два вектора a, b по первому элементу вернуть результат, если они отличаются; в противном случае сравните второй элемент и т. д.

Например, если a = [0 1 5], b = [0 2 1]Я хотел бы иметь

a <? b

для некоторого оператора / функции <? вернуть истину.

Если я просто сделаю a < b, это вернет вектор логических значений.

ans =

  0  1  0

3 ответа

Решение

Следующее будет работать как для MATLAB, так и для Octave...

Вы можете создать функцию сравнения, используя find вот так:

lexlt = @(a, b) find([a < b true], 1) < find([a > b true], 1);

Он вернет true, если первый векторный аргумент лексографически меньше второго, и false в противном случае (если он больше или равен ему). Например:

>> a = [0 1 5];
>> b = [0 2 1];
>> lexlt(a, a)

ans =

  logical

   0

>> lexlt(a, b)

ans =

  logical

   1

>> lexlt(b, a)

ans =

  logical

   0

А вот соответствующая функция для сравнения "больше чем" (т. Е. Первый аргумент лексографически больше второго):

lexgt = @(a, b) find([a > b true], 1) < find([a < b true], 1);

В Octave вы можете использовать issorted:

result = ~isequal(a,b) && issorted([a;b],'rows');

В MATLAB вы можете использовать issortedrows:

result = issortedrows([a;b],'strictascend')

Найдите первый индекс, которому они не равны. Затем сравните их в указанном индексе.

idx = find(a ~= b);
result = a(idx(1)) < b(idx(1)); % if length(idx) > 0
Другие вопросы по тегам