julia在矩阵中找到(row,col)而不是index

时间:2014-10-04 20:10:38

标签: matrix find julia

在Julia中,您可以通过以下方式找到矩阵中元素的坐标:

julia> find( x -> x == 2, [ 1 2 3; 2 3 4; 1 0 2] )
3-element Array{Int64,1}:
 2
 4
 9

这些值是正确的,但我更希望我得到(row,col)元组。

(1,2)
(2,1)
(3,3) 

在朱莉娅实现这一目标的最简单方法是什么?

4 个答案:

答案 0 :(得分:5)

我不相信有一种内置方式可以做到这一点,但这是一个功能来做到这一点

function findmat(f, A::AbstractMatrix)
  m,n = size(A)
  out = (Int,Int)[]
  for i in 1:m, j in 1:n
    f(A[i,j]) && push!(out,(i,j))
  end
  out
end

e.g。

julia> findmat(x->x==2, [ 1 2 3; 2 3 4; 1 0 2] )
3-element Array{(Int64,Int64),1}:
 (1,2)
 (2,1)
 (3,3)

如果大量的物品满足条件,那么两次通过可能会更有效率,但我对此表示怀疑。

答案 1 :(得分:4)

如果其他人发现这一点,您现在可以使用:

ind2sub(a, index)

它将一个下标元组返回到与线性索引a对应的数组index

答案 2 :(得分:3)

我在Julia标准库中找到的最接近的是findn

julia> A = [1 2 3; 2 3 4; 1 0 2]
3x3 Array{Int64,2}:
 1  2  3
 2  3  4
 1  0  2

julia> findn(A .== 2)
([2,1,3],[1,2,3])

这给出了一个向量元组而不是元组向量。

需要注意的另一件事是(2,1)处的匹配在(1,2)之前报告。这是因为Julia中的数组按列主要顺序存储,因此按存储顺序扫描数组A将查看(2,1)之前的位置(1,2)

答案 3 :(得分:2)

如果您希望避免定义“新”功能,可能:

collect(zip(ind2sub((3,3),find( x -> x == 2, [ 1 2 3; 2 3 4; 1 0 2] ))...))

正是您要找的。 (3,3)隐含在矩阵的大小中。如果矩阵由变量给出,那么使用size(M)

看起来更自然