Julia 如何从矩阵中选择奇数?
如何从大于29的矩阵中选择奇数?您可以使用:Julia 如何从矩阵中选择奇数?,julia,Julia,如何从大于29的矩阵中选择奇数?您可以使用: filter(x->isodd(x)和&x>29,M) 在这里,x->isodd(x)&&x>29是一个指定过滤标准的函数,M是一个矩阵 例如: 或者,您可以使用: 只是吹毛求疵,但您可能不应该在匿名函数中使用&&&短路,这意味着它引入了一个分支,与isodd和操作相比,分支速度较慢。在您的示例中,将&&替换为&,我在1000x1000矩阵上获得了几乎3倍的速度提升。但它们的计算结果不一样吗?将isodd(31)和&31>29与isodd(31)和&
filter(x->isodd(x)和&x>29,M)
在这里,x->isodd(x)&&x>29是一个指定过滤标准的函数,M
是一个矩阵
例如:
或者,您可以使用:
只是吹毛求疵,但您可能不应该在匿名函数中使用&&
<代码>&
短路,这意味着它引入了一个分支,与isodd
和
操作相比,分支速度较慢。在您的示例中,将&&
替换为&
,我在1000x1000矩阵上获得了几乎3倍的速度提升。但它们的计算结果不一样吗?将isodd(31)和&31>29
与isodd(31)和&31>29
进行比较。由于运算符优先级,只需正确插入括号:isodd(31)和(31>29)
。参见Base.operator\u priority(:&)
和Base.operator\u priority(:>)
@crstnbr,它们计算相同的内容,但比较&
与&
生成的汇编指令。前者中有跳转指令,而不是后者。但同样,这取决于你的微秒有多宝贵:)也有可能使用逻辑索引:M[isodd.(M.&(M.>29)]
。哪种方法更有效可能会有很大的不同。
julia> M = rand(1:50, 3,3)
3×3 Array{Int64,2}:
20 42 35
23 6 31
28 4 4
julia> filter(x->isodd(x)&&x>29, M)
2-element Array{Int64,1}:
35
31
julia> [x for x in M if isodd(x) && x>29]
2-element Array{Int64,1}:
35
31