добавление скаляра в массив в юлии - PullRequest
0 голосов
/ 14 сентября 2018

Пытается получить линейное уравнение y = m*x + c.У меня есть следующие строки кода, пытаясь добавить скаляр в массив.

m = 1.1; c = 0.11;
x = rand(1,2)
  1×2 Array{Float64,2}:
  0.920045  0.660015

y = m*x + c
ERROR: MethodError: no method matching +(::Array{Float64,2}, ::Float64)
Closest candidates are:
  +(::Any, ::Any, ::Any, ::Any...) at operators.jl:502
  +(::Bool, ::T<:AbstractFloat) where T<:AbstractFloat at bool.jl:112
  +(::Float64, ::Float64) at float.jl:395
  ...
Stacktrace:
 [1] top-level scope at none:0

В настоящее время используется Julia 1.0.Непосредственное добавление скаляра в массив не сработало.В предыдущих версиях это работало, я полагаю.

Скалярное умножение работает

m*x
 1×2 Array{Float64,2}:
 1.01205  0.726016

Но я должен определить другой массив, а затем выполнить сложение, как показано.

c = [0.11 0.11]
y = m*x + c
1×2 Array{Float64,2}:
 1.12205  0.836016

Разве это не накладные расходы?Какая разница, когда я могу выполнять скалярное умножение m*x для массивов, но не для сложения?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Этот код иллюстрирует полезный комментарий Богумила Каминьского:

julia> m = 1.1
1.1
julia> c = 0.11
0.11
julia> x = rand(1,2)
1×2 Array{Float64,2}:
 0.77683  0.510671

# .+ operator IS used for the addition of the constant.    
julia> y = m*x .+ c
1×2 Array{Float64,2}:
 0.964514  0.671738

# .+ operator is NOT used for the addition of the constant, get Error.    
julia> y = m*x + c
ERROR: MethodError: no method matching +(::Array{Float64,2}, ::Float64)

Вы не одиноки в желании выполнить матрицу + скалярную операцию, см. здесь .

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

Однако правила для этого программного обеспечения весьма отличались от правил для матриц в стандартной линейной алгебре.Например, в алгебре матриц данных, используемой этим программным обеспечением, AB = BA, таким образом, коммутативно для умножения матриц, потому что оператор умножения матриц был определен как поэлементное умножение.

Это полностью отличается от стандартной матричной алгебры, но это было то, что я хотел.

0 голосов
/ 14 сентября 2018

Полагаю, это стало строже. В синтаксисе Julia (как в MATLAB) + и * работают с конгруэнтными массивами.

Для поэлементной работы вы должны использовать .+ и .*. Как ни странно, это не имеет значения для *, но это имеет значение для +.

Во всяком случае, оба следующие работы:

y = m * x .+ c

и

y = m .* x .+ c
...