如何测试数组中的所有元素在Julia中是否具有相同的值
我试图编写一个简单的程序,使用Julia测试数组的所有元素是否相同。朱莉娅有没有一个简单的方法可以做到这一点如何测试数组中的所有元素在Julia中是否具有相同的值,julia,Julia,我试图编写一个简单的程序,使用Julia测试数组的所有元素是否相同。朱莉娅有没有一个简单的方法可以做到这一点 allunique测试数组的所有元素是否唯一。为了测试数组的所有元素是否相同,您可以编写以下代码,例如: function allequal(itr) local x isfirst = true for v in itr if isfirst x = v isfirst = false
allunique
测试数组的所有元素是否唯一。为了测试数组的所有元素是否相同,您可以编写以下代码,例如:
function allequal(itr)
local x
isfirst = true
for v in itr
if isfirst
x = v
isfirst = false
else
isequal(x, v) || return false
end
end
return true
end
现在你有了
julia> allequal([1,2,3])
false
julia> allequal([1,2,1])
false
julia> allequal([1,1,1])
true
您可以编写一个较短的函数,例如:
f1(itr) = length(Set(itr)) <= 1
如果您的iterable已定义长度
并支持索引
length(itr)==0 || all( ==(itr[1]), itr)
这似乎比建议的allequal
功能快3倍
一些基准:
julia> allequal_2(itr) = length(itr)==0 || all( ==(itr[1]), itr);
julia> const vv = ones(10000000)*3;
julia> @btime allequal($vv)
13.212 ms (0 allocations: 0 bytes)
true
julia> @btime allequal_2($vv)
4.178 ms (0 allocations: 0 bytes)
true
更有趣的是,它比提议的非常类似的f2
功能快2倍:
julia> @btime f2($vv)
9.509 ms (0 allocations: 0 bytes)
很好的捕捉和回答。很抱歉。有一点大脑故障:)
all(isequal(first(itr)),itr)
如果迭代器不支持索引,也可以工作,不是吗?是的,但作为特例,您必须检查itr
是否为空。另外,first
可能会改变某些iterables的状态,一般来说,如果他们支持getindex
,那么假设使用它不会影响它是相当安全的。很好!我自己最大的努力是21.346ms(2次分配:76.29mib)
,因此这大大减少了工作量。显然,itr[1]
可以替换为first(itr)
而不受惩罚。就我所见,将其全部封装在参数化类型中也没有任何损失。移除长度检查并没有提高速度。这里的交易破坏者正在用=
取代Bogumił的isequal
。谁会想到!但是阅读表明,原因可能是isequal检查NaN
和missing
。Yes==(41;
是最快的选择。类似地,您有>(41;
,
julia> @btime f2($vv)
9.509 ms (0 allocations: 0 bytes)