朱莉娅-如何在数组中使用CartesianIndices

3

我正在尝试访问一个NxN矩阵“msk”的特定元素,该元素的索引存储在一个Mx2数组“idx”中。 我尝试了以下方法:

N = 10
msk = zeros(N,N)
idx = [1 5;6 2;3 7;8 4]
#CIs = CartesianIndices(( 2:3, 5:6 )) # this works, but not what I want
CIs = CartesianIndices((idx[:,1],idx[:,2]))
msk[CIs] .= 1

我得到了以下错误信息:ERROR: LoadError: MethodError: 没有与Tuple{Array{Int64,1},Array{Int64,1}}匹配的CartesianIndices方法。

如果您可以控制索引的存储方式,那么代码可以编写得非常干净。例如,如果 ind = [(1,5), (6,2), (3,7), (8,4)],那么您的笛卡尔索引就是 CartesianIndex.(ind)。如果您被困在一个索引矩阵中,则必须使用更复杂的 eachcol 解决方案。 - DNF
1个回答

3

这是您想要的吗?(我使用了您的定义)

julia> msk[CartesianIndex.(eachcol(idx)...)] .= 1;

julia> msk
10×10 Array{Float64,2}:
 0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0

请注意,我使用 CartesianIndex 向量:
julia> CartesianIndex.(eachcol(idx)...)
4-element Array{CartesianIndex{2},1}:
 CartesianIndex(1, 5)
 CartesianIndex(6, 2)
 CartesianIndex(3, 7)
 CartesianIndex(8, 4)

CartesianIndices是什么:

定义一个区域,R,它跨越一个整数索引的多维矩形范围。

因此,由此定义的区域必须是矩形的。

另一种获取所需索引的方法是:

julia> CartesianIndex.(Tuple.(eachrow(idx)))
4-element Array{CartesianIndex{2},1}:
 CartesianIndex(1, 5)
 CartesianIndex(6, 2)
 CartesianIndex(3, 7)
 CartesianIndex(8, 4)

或者(这次我们使用线性索引进入 msk ,因为它只是一个矩阵
julia> [x + (y-1)*size(msk, 1) for (x, y) in eachrow(idx)]
4-element Array{Int64,1}:
 41
 16
 63
 38

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接