Замена значений определенных записей в массиве в Julia - PullRequest
1 голос
/ 13 июня 2019

Мне интересно, как эффективно реализовать код, который заменяет некоторые записи массива конкретными значениями.Другими словами, у меня есть матрица и вектор с некоторыми индексами матрицы, где выполняется логическое условие.Я хочу изменить эти записи для некоторых значений, которые я имею в векторе.

Пока что я делаю это с помощью цикла, но, возможно, есть лучшая стратегия, которая использует фильтрацию или что-то в этом роде.

Небольшой пример будет:

A = collect(1:8); println(A)
   B = [10,20]
   C = A.<=2
   k = 1
   for t=1:8
                if C[t] ==  1
                    A[t] = B[k]
                    k = k+1
            else
       end
    end

Однако мне нужно сделать это внутри довольно интенсивного цикла с большей матрицей.Индексы, которые я должен изменить, всегда одинаковы, но вектор значений (аналог B) меняется в каждой итерации.

Большое спасибо!

1 Ответ

3 голосов
/ 13 июня 2019

Вы можете просто написать:

A = collect(1:8)
B = [10,20]
C = findall(A.<=2)
A[C] = B

Использование функции findall также можно переписать как C = findall(x -> x <= 2, A), чтобы уменьшить количество выделений. Ключ в том, что лучше, если C содержит фактические индексы, чем логические индексы. Технически A[C] = B также будет принимать логические индексы в C, но тогда это медленнее. И при условии, что C вычисляется один раз, а A[C] = B вычисляется много раз, лучше предварительно вычислить индексы, которые вы хотите использовать.

Если C меняется с каждой итерацией, то, возможно, было бы лучше написать C .= A .<= 2, а затем A[C] = B (обратите внимание, что здесь я использую внутреннее обновление C, поскольку, когда оно обновляется много раз, оно быстрее ). Вам нужно будет оценить, что лучше в вашем конкретном случае.

...