неточная ошибка у Юлии - матричный расчет - PullRequest
0 голосов
/ 14 ноября 2018

Ошибка возникает после условия else. Я хочу заменить колонку А новой. Ниже приведен тип данных переменных. Кажется, это проблема типа данных.

A = [1 1 1 1 1 0 0;
     1 2 0 3 0 1 0;
     2 1 2 0 0 0 -1;
     2 3 1 1 0 0 0]
b = [20 24 16 20]'
c = [-1 -2 -3 -4 0 0 0]'
C = [1 5 6 4]'

## convert the datatype of original data
C = vec(C)
# initial basis matrix
B = A[:, C]
# initial basic solution
x = inv(B)*b
c_B = c[C]
# initial reduced costs
c_r = (c' - c_B'*inv(B)*A)'
# if basic matrix is not identity (e.g., take other variables other than slack
# variables as starting point), convert B=I and N=inv(B)
ind = eye(length(C))
j = 1
if B != ind
    for i in length(c)
        if i in C
            A[:,i] = ind[:,j]
            j += 1
        else
            A[:,i] = inv(B)*A[:,i]
        end
    end
end

1 Ответ

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

У вас есть следующие проблемы с кодом.Сначала A - это Matrix{Int64}, и оно должно быть Matrix{Float64}.Вы можете исправить это, написав:

A = Float64[1 1 1 1 1 0 0;
            1 2 0 3 0 1 0;
            2 1 2 0 0 0 -1;
            2 3 1 1 0 0 0]

Второе - вы, вероятно, хотите, чтобы индекс i варьировался от 1 до length(c), поэтому вы должны записать свой цикл как:

for i in 1:length(c)

Наконец - ваш код не будет работать под Julia 1.0 не только потому, что eye не определен, но и потому, что вы обновляете переменную j внутри цикла.Я бы порекомендовал вам обернуть весь код в функцию или написать global j += 1, чтобы он работал под Julia 1.0.

РЕДАКТИРОВАТЬ:

Проблема - в двух словах заключается в следующем:

julia> A = [1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

julia> A[1] = 0.5
ERROR: InexactError: Int64(Int64, 0.5)

Массив A может содержать только целые числа, поэтому вы не можете присвоить ему число с плавающей точкой.Написав Float64 перед литералом массива, вы заставляете его иметь другой тип элемента, так что это работает:

julia> A = Float64[1,2,3]
3-element Array{Float64,1}:
 1.0
 2.0
 3.0

julia> A[1] = 0.5
0.5

julia> A
3-element Array{Float64,1}:
 0.5
 2.0
 3.0

Короче говоря, Джулия знает, содержит ли ваш массив целые числа или числа с плавающей запятой, и проверяет его.Иногда допускается продвижение типов (например, вы можете присвоить целое число массиву с плавающей точкой, поскольку это обычно не приводит к потере точности), как описано здесь https://docs.julialang.org/en/latest/manual/conversion-and-promotion/#Conversion-1.

...