Julia矩阵计算中的不精确误差

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

错误发生在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

代码中存在以下问题。第一个
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]。我已经添加了一个解释。我强烈建议您阅读,因为它包含许多有用的例子和解释。