【问题标题】:Find first row of a matrix <= to a vector找到矩阵的第一行 <= 到向量
【发布时间】:2020-02-02 18:27:50
【问题描述】:

我有两个数组 t1::Array{Float64, 2}t2::Array{Float64, 2} 具有相同的列数。 t2 只有一行。

我想找到t1 的第一行,即&lt;= t2(即第一行i 使得t1[i, j] &lt;= t2[1, j] 对应所有j)。在之前的 julia 版本中,我使用了这个命令:

findfirst(all(t1 .<= t2, 2))

它不再起作用了。命令all(t1 .&lt;= t2, 2)返回如下错误:

ERROR: MethodError: objects of type BitArray{2} are not callable
Use square brackets [] for indexing an Array.

您能告诉我如何在不使用 for 循环的情况下在更新的 Julia 版本中执行此操作吗? (我使用的是 1.1.0)

【问题讨论】:

    标签: matrix vector julia


    【解决方案1】:

    all 的语法现在是 all(A; dims),因此您可以改用 all(x .&lt;= y; dims=2)

    julia> x = [4 5 6]
    1×3 Array{Int64,2}:
     4  5  6
    
    julia> y = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
    4×3 Array{Int64,2}:
      1   2   3
      4   5   6
      7   8   9
     10  11  12
    
    julia> all(x .<= y; dims=2)
    4×1 BitArray{2}:
     0
     1
     1
     1
    

    但是,请注意all(x .&lt;= y; dims=2) 的输出是一个列矩阵(不是一个向量),所以如果你将findfirst 应用到它,那么findfirst 返回一个CartesianIndex

    julia> findfirst(all(x .<= y; dims=2))
    CartesianIndex(2, 1)
    

    如果你想要一个带有行号的整数,你可以简单地提取CartesianIndex的第一个元素:

    julia> findfirst(all(x .<= y; dims=2))[1]
    2
    

    或者,您可以使用vecall 的输出转换为向量:

    julia> findfirst(vec(all(x .<= y; dims=2)))
    2
    

    【讨论】:

    • dropdims(all(x .&lt;= y; dims=2), dims=2)
    【解决方案2】:

    我认为这将是最接近的等价物

    julia> x = [4 5 6]
    1×3 Array{Int64,2}:
     4  5  6
    
    julia> y = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
    4×3 Array{Int64,2}:
      1   2   3
      4   5   6
      7   8   9
     10  11  12
    
    julia> findfirst(all, collect(eachrow(x .<= y)))
    2
    

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多