Например,
And @@ Thread[A >= B]
должен выполнять работу.
РЕДАКТИРОВАТЬ: С другой стороны, это
cmp = Compile[
{
{a, _Integer, 1},
{b, _Integer, 1}
},
Module[
{flag = True},
Do[
If[Not[a[[p]] >= b[[p]]], flag = False; Break[]],
{p, 1, Length@a}];
flag],
CompilationTarget \[Rule] "C"
]
в 20 раз быстрее.Хотя и в 20 раз страшнее.
РЕДАКТИРОВАТЬ 2: Поскольку у Дэвида нет компилятора C, здесь приведены все временные результаты с двумя отличиями.Во-первых, его второй метод был исправлен для сравнения всех элементов.Во-вторых, я сравниваю a
с самим собой, что является худшим случаем (в противном случае мой второй метод, приведенный выше, должен будет сравнивать только элементы до первого, чтобы нарушить условие).
(*OP's method*)
And @@ Table[a[[i]] >= b[[i]], {i, 10^6}] // Timing
(*acl's uncompiled method*)
And @@ Thread[a >= b] // Timing
(*Leonid's method*)
lessEqual[a, b] // Timing
(*David's method #1*)
NonNegative[Min[a - b]] // Timing
(*David's method #2*)
Timing[result = True;
n = 1; While[n < Length[a],
If[a[[n]] < b[[n]], result = False; Break[]];
n++]; result]
(*acl's compiled method*)
cmp[a, a] // Timing
Таким образом, скомпилированный метод намного быстрее (обратите внимание, что второй метод Дэвида и скомпилированный метод здесь - это один и тот же алгоритм, и единственная разница - накладные расходы).
Все они работают от батареи, поэтомумогут быть некоторые случайные колебания, но я думаю, что они являются репрезентативными.
РЕДАКТИРОВАТЬ 3: Если, как предложил ruebenko в комментарии, я заменяю Part
на Compile`GetElement
, как это
cmp2 = Compile[{{a, _Integer, 1}, {b, _Integer, 1}},
Module[{flag = True},
Do[If[Not[Compile`GetElement[a, p] >= Compile`GetElement[b, p]],
flag = False; Break[]], {p, 1, Length@a}];
flag], CompilationTarget -> "C"]
тогда cmp2
в два раза быстрее cmp
.