在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
答案 0 :(得分:4)
您在代码中遇到以下问题。第一个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
简而言之,Julia知道您的数组是保留整数还是浮点数并进行检查。有时可以使用类型提升功能(例如,您可以为浮点数数组分配一个整数,因为这通常不会导致精度下降),如此处https://docs.julialang.org/en/latest/manual/conversion-and-promotion/#Conversion-1所述。