如何测试数组中的所有元素在Julia中是否具有相同的值

如何测试数组中的所有元素在Julia中是否具有相同的值,julia,Julia,我试图编写一个简单的程序,使用Julia测试数组的所有元素是否相同。朱莉娅有没有一个简单的方法可以做到这一点 allunique测试数组的所有元素是否唯一。为了测试数组的所有元素是否相同,您可以编写以下代码,例如: function allequal(itr) local x isfirst = true for v in itr if isfirst x = v isfirst = false

我试图编写一个简单的程序,使用Julia测试数组的所有元素是否相同。朱莉娅有没有一个简单的方法可以做到这一点

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)