Присвоить значения матрице Джулии на основе условия - PullRequest
1 голос
/ 17 апреля 2019

У меня есть матрица нулей A, которая имеет размерность (m x n).У меня есть другая матрица некоторых целочисленных значений b.b имеет длину n.Я хочу, чтобы A был установлен на идентичность везде, где b имеет значения больше 5. Поэтому, в основном, для каждой строки A, где b имеет значение больше 5, установите его на идентичность.

Я пытался сделать это, но это не работает.У кого-нибудь есть идеи, как это сделать в Юлии?

using LinearAlgebra
usable_values = filter((x) -> x > 5, b)
# A[:, usable_values] = I
A[:, b .> 5] = I

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Я не уверен, что понимаю, что вы имеете в виду под «установить идентичность»: матрица идентичности должна быть квадратной, и, следовательно, строка или столбец матрицы не могут быть равны матрице идентичности.Я буду работать в предположении, что вы хотите, чтобы записи имели значение 1. В этом случае

A[:, findall(b .> 5)] .= 1

- это простая однострочная строка.Давайте обсудим элементы здесь:

  • Как предложено выше, filter выберет элементы b больше 5. Но вам нужны индексы тех элементов, для которых findallсоответствующая функция.
  • Обратите внимание на использование широковещательного присвоения, .=.Это значит назначить RHS каждому элементу левой стороны.Таким образом, вам не нужно создавать матрицу в RHS.

Циклический подход тоже хорош, но из соображений производительности я бы добавил это в функцию.См. советы по повышению производительности .

1 голос
/ 17 апреля 2019

Если вам нужно для каждой строки A, где b имеет значение больше 5, установите для него значение , это может быть полезно для вас, пока вы ждете, что некоторые из гуру здесь могутнапишите то же самое в одной строке кода:)

n = 2
m = 5
A = zeros(m, n)
b = rand(1:10, m)

println(b)

for (cnt, value) in enumerate(b)
    if value > 5
        A[cnt, :] = ones(1, n)
    end
end
A

Результат, который я получаю:

b = [4, 2, 6, 8, 1]

5×2 Array{Float64,2}:
0.0  0.0
0.0  0.0
1.0  1.0
1.0  1.0
0.0  0.0

Я довольно плохо знаком с языком, это лучшее, что я могу сделать дляпомогите, пока.

...