Найти первую строку матрицы <= к вектору - PullRequest
3 голосов
/ 02 февраля 2020

У меня есть два массива t1::Array{Float64, 2} и t2::Array{Float64, 2} с одинаковым количеством столбцов. t2 имеет только одну строку.

Я хочу найти первую строку t1, которая равна <= t2 (т. Е. Первая строка i такая, что t1[i, j] <= t2[1, j] для всех j) , В предыдущей версии julia я использовал эту команду:

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

Она больше не работает. Команда all(t1 .<= t2, 2) возвращает следующую ошибку:

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

Не могли бы вы рассказать, как это сделать в более поздней версии julia без использования циклов for? (Я использую 1.1.0)

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Синтаксис для all теперь all(A; dims), поэтому вместо него можно использовать all(x .<= 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 .<= 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

В качестве альтернативы, вы можете превратить вывод all в вектор, используя vec:

julia> findfirst(vec(all(x .<= y; dims=2)))
2
1 голос
/ 02 февраля 2020

Я думаю, что это будет ближайший эквивалент

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...