обновить глобальную переменную Array {Float64, 2} внутри цикла for - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь написать программу Julia для решения проблемы субградиента и столкнулся с проблемой обновления начальной точки, то есть переменной x в следующем коде (обведено кружком).

using Random
using Convex, SCS
using Plots

Random.seed!(1234)

n = 20; m = 200
A = randn(m, n); b = rand(m,1); c = -A' * randn(m,1)

x_min = Variable(n)
problem = minimize(c' * x_min, [A * x_min <= b])
solve!(problem, SCSSolver())
f_min = problem.optval

f = []; push!(f, Inf)
fbest = []; push!(fbest, Inf)
fconstr = []

MAX_ITERS = 2500; EPS = 1e-3; 

#############################################
x = zeros(n, 1) # initialized here          
#############################################

for k in 1:MAX_ITERS
  fval, ind = findmax(A * x - b)
  if fval > 0
    push!(fbest, fbest[end])
    g = A[ind, :]'
    alpha_tmp = (fval+EPS) / norm(g)^2
  else
    push!(f, c' * x)
    push!(fbest, min( (c'*x)[1], fbest[end] ))
    g = c
    alpha_tmp = 1 / k
  end
  push!(fconstr, fval)

#############################################
  global x = x - g * alpha_tmp #update here
#############################################

  if rem(k, 100) == 0
    break
  end
end

ОШИБКА, о которой мне сказали, следующая

ERROR: LoadError: DimensionMismatch("dimensions must match")
Stacktrace:
 [1] promote_shape at ./indices.jl:154 [inlined]
 [2] promote_shape at ./indices.jl:145 [inlined]
 [3] -(::Array{Float64,2}, ::LinearAlgebra.Adjoint{Float64,Array{Float64,1}}) at ./arraymath.jl:38
 [4] top-level scope at julia_code/test.jl:40 [inlined]
 [5] top-level scope at ./none:0
in expression starting at julia_code/test.jl:25
...