Julia中的不精确错误-矩阵计算

时间:2018-11-14 11:54:49

标签: julia

在else条件之后发生错误。我想用新列替换A列。以下是变量的数据类型。似乎是数据类型问题。

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 :(得分:4)

您在代码中遇到以下问题。第一个AMatrix{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的范围从1length(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

简而言之,Julia知道您的数组是保留整数还是浮点数并进行检查。有时可以使用类型提升功能(例如,您可以为浮点数数组分配一个整数,因为这通常不会导致精度下降),如此处https://docs.julialang.org/en/latest/manual/conversion-and-promotion/#Conversion-1所述。