Julia矩阵计算中的不精确误差
错误发生在else条件之后。我想用新的列替换A的列。以下是变量的数据类型,似乎是数据类型问题Julia矩阵计算中的不精确误差,julia,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
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
代码中存在以下问题。第一个
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知道数组是包含整数还是浮点数,并检查它。有时允许进行类型升级(例如,您可以为浮点数组分配一个整数,因为这通常不会导致精度损失),如下所述。您在代码中遇到以下问题。第一个
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知道数组是包含整数还是浮点数,并检查它。有时允许进行类型升级(例如,您可以为浮点数组指定一个整数,因为这通常不会导致精度损失),如此处所述。请编辑您的帖子并粘贴控制台文本,而不是屏幕截图图像。如果前面有四个空格,文本将被格式化为代码。你也可以使用Ctrl+K键。注意,
eye()在版本0.7和1.0中已被弃用,取而代之的是I和矩阵构造函数
。请编辑帖子并粘贴控制台文本,而不是屏幕截图。如果前面有四个空格,文本将被格式化为代码。您也可以使用Ctrl+K。请注意,eye()在0.7和1.0版本中已被弃用,取而代之的是I和矩阵构造函数。在我的笔记本电脑上,Julia的eye功能运行得很好,不过我把它换成了另一个。但是问题已经解决了,我仍然不明白为什么它会影响A[:,I]=inv(B)*A[:,I]。我已经添加了一个解释。我强烈建议你阅读,因为它包含了许多有用的例子和解释。嗨,谢谢你的解决方案。在我的笔记本电脑上,Julia的eye功能运行得很好,不过我把它换成了另一个。但是问题已经解决了,我仍然不明白为什么它会影响A[:,I]=inv(B)*A[:,I]。我已经添加了一个解释。我强烈建议您阅读,因为它包含许多有用的例子和解释。