首页 > 解决方案 > 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

标签: julia

解决方案


您的代码有以下问题。首先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的范围从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

简而言之,Julia 知道您的数组是否包含整数或浮点数并检查它。有时允许类型提升(例如,您可以将整数分配给浮点数组,因为这通常不会导致精度损失),如此处所述https://docs.julialang.org/en/latest/manual/conversion -and-promotion/#Conversion-1


推荐阅读