例如,
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:由于 David 没有可用的 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 的两倍。