CI
是给定的向量。每个元素都是CartesianIndex
。
julia> CI
5-element Vector{CartesianIndex{3}}:
CartesianIndex(1, 3, 1)
CartesianIndex(1, 1, 4)
CartesianIndex(2, 2, 3)
CartesianIndex(1, 2, 4)
CartesianIndex(1, 1, 1)
我想在 CI 中查找第
d
个元素为 k
的元素。让 f(CI,d,k)
成为这样一个函数。
julia> f(CI,1,2)
[CartesianIndex(2, 2, 3) ]
julia> f(CI,2,1)
[CartesianIndex(1, 1, 4), CartesianIndex(1, 1, 1)]
如何定义这样的函数
f
?
我想一个简单的方法是将 CI
转换为矩阵数组,然后使用 findall
函数。但我觉得还有更聪明的方法。
Julia 有很多方法可以完成这个任务。以下是一些例子:
函数的一个方法将任意一元函数作为其第一个参数,该函数传递给相关集合的每个元素,如果它返回
true
,则被视为匹配。
CartesianIndex
值可以像
Tuple
s一样进行索引,因此可以使用它来查找
CI
的哪些元素在维度
value
中具有
d
值:
julia> CI = [CartesianIndex(1,3,1), CartesianIndex(1,1,4), CartesianIndex(2,2,3), CartesianIndex(1,2,4), CartesianIndex(1,1,1)]
5-element Vector{CartesianIndex{3}}:
CartesianIndex(1, 3, 1)
CartesianIndex(1, 1, 4)
CartesianIndex(2, 2, 3)
CartesianIndex(1, 2, 4)
CartesianIndex(1, 1, 1)
julia> CI[2]
CartesianIndex(1, 3, 1)
julia> CI[2][1]
1
julia> findall(idx -> idx[2] == 1, CI)
2-element Vector{Int64}:
2
5
julia> f(ci, d, value) = ci[findall(idx -> idx[d] == value, ci)]
f (generic function with 1 method)
julia> f(CI, 1, 2)
1-element Vector{CartesianIndex{3}}:
CartesianIndex(2, 2, 3)
julia> f(CI, 2, 1)
2-element Vector{CartesianIndex{3}}:
CartesianIndex(1, 1, 4)
CartesianIndex(1, 1, 1)
您还可以广播getindex
==
运算符并使用向量的逻辑索引达到相同的效果:
julia> getindex(CI[1], 2)
3
julia> getindex.(CI, 2)
5-element Vector{Int64}:
3
1
2
2
1
julia> getindex.(CI, 2) .== 1
5-element BitVector:
0
1
0
0
1
julia> f2(ci, d, value) = ci[getindex.(ci, Ref(d)) .== value]
f2 (generic function with 1 method)
julia> f2(CI, 1, 2)
1-element Vector{CartesianIndex{3}}:
CartesianIndex(2, 2, 3)
julia> f2(CI, 2, 1)
2-element Vector{CartesianIndex{3}}:
CartesianIndex(1, 1, 4)
CartesianIndex(1, 1, 1)