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