如何修复julia中的错误边界?

如何修复julia中的错误边界?,julia,Julia,此代码是对非支配点进行排序的代码的一部分F是一个保持帕累托前沿的单元数组。但是Julia给出了这个错误: BoundsError:尝试访问索引[1]处的0元素数组{Any,1} 集合索引!(::数组{Any,1},::Any,::Int64)位于essentials.jl:183 非支配排序时的宏扩展。juliarc.jl:41[内联] 你能帮帮我吗。我怎样才能修好它 #=pop is a structure including struct individual position

此代码是对非支配点进行排序的代码的一部分
F
是一个保持帕累托前沿的单元数组。但是Julia给出了这个错误:

BoundsError:尝试访问索引[1]处的0元素数组{Any,1}
集合索引!(::数组{Any,1},::Any,::Int64)位于essentials.jl:183
非支配排序时的宏扩展。juliarc.jl:41[内联]

你能帮帮我吗。我怎样才能修好它

#=pop is a structure including 
struct individual
    position
    cost
    Rank
    Dominationset
    Dominatedcount
    Crowdingdostance
end
this pop is used for this code as input
5-element Array{individual,1}:
 individual(Any[-3, 4, -2], Any[1.0, 1.0], Any[], Any[], Any[], Any[])
 individual(Any[4, 4, 1], Any[1.0, 1.0], Any[], Any[], Any[], Any[])
 individual(Any[1, 4, 4], Any[1.0, 1.0], Any[], Any[], Any[], Any[])
 individual(Any[4, 4, -2], Any[1.0, 1.0], Any[], Any[], Any[], Any[])
 individual(Any[1, 4, 2], Any[0.999999, 1.0], Any[], Any[], Any[], Any[])=#

using JuMP,DataStructures
npop=length(pop);
l=0;
F=[]; # F{1}=[] in matlab it is correct
for i=1:npop
    for j=i+1:npop
        p=pop[i];
        q=pop[j];
        if (dominates(p.cost,q.cost))
            append!(p.Dominationset,j);
            append!(q.Dominatedcount,l+1)
        end
        if (dominates(q.cost,p.cost))
            append!(q.Dominationset,i);
            append!(p.Dominatedcount,l+1)
        end
        pop[i]=p;
        pop[j]=q;
    end
    if pop[i].Dominatedcount==[]
        F[1]=[F;i]; #F{1}=[F{1} i] in matlab is used
        append!(pop[i].Rank,1);
    end
end
主要功能如下:

function dominates(x,y)  
    b=all(x.<=y) && any(x.<y);
    return(b);
end
函数占主导地位(x,y)
b=all(x.您的问题在这里:

F[1]=[F;i]
F
是一个空向量,因此不能将任何内容分配给元素
1
。这与Matlab不同,Matlab会自动(并且危险地)动态扩展数组。请改用:
push!

push!(F, ??)
我加上问号是因为我不明白你到底想在这里把什么放进F。把
F
本身放在一个向量中,然后把它赋给
F
的第一个元素。很抱歉,这对我来说毫无意义。(编辑:你的Matlab代码,
F{1}=[F{1}I]
,在这里也没有意义。你是不是想写
F=[F,i]

另外,您确定需要在任何地方使用
Any
吗?未键入的
struct
s和
Any
向量将使您的代码非常慢。

您的问题在于:

F[1]=[F;i]
F
是一个空向量,因此不能将任何内容分配给元素
1
。这与Matlab不同,Matlab会自动(并且危险地)动态扩展数组。请改用:
push!

push!(F, ??)
我加上问号是因为我不明白你到底想在这里把什么放进F。把
F
本身放在一个向量中,然后把它赋给
F
的第一个元素。很抱歉,这对我来说毫无意义。(编辑:你的Matlab代码,
F{1}=[F{1}I]
,在这里也没有意义。你是不是想写
F=[F,i]


另外,您确定需要在任何地方使用
Any
吗?无类型的
struct
s和
Any
向量将使您的代码非常慢。

非常感谢。事实上
F
是一个矩阵,任何元素都是一些定标器的向量或矩阵。例如,运行此代码后。F必须如下:
F=[43;74;21]]3元素数组{Array{Int64,N}其中N,1}:[43,74,21]
似乎不对:
[[43;74;21]]
不是一个3元素向量,而是一个1元素向量,其中包含一个3元素向量。您是否正确地从命令行复制粘贴了它?另外,您是说
F
应该是一个向量向量?或者是一个矩阵向量,或者是一个向量和矩阵的混合向量?所有这些数组的大小和形状都相同吗?yes、 很抱歉,这是错误的。它有一个如下所示的向量。但在主代码的其他部分,其他一些人将添加到F。然后作为一个整体,F是n维的,每个元素都是数组。此外,这些数组有不同的大小。但形状可以相同。无论如何,只要使用
推送!
,如果你关心性能,看看你是否可以将具体类型赋给结构域,或者至少避免所有
Any
-vectors。非常感谢。事实上
F
是一个矩阵,其中任何元素都是向量或某些定标器的矩阵。例如,运行此代码后。F必须如下:
F=[[43;74;21]]3元素数组{Array{Int64,N},其中N,1}:[43,74,21]
这似乎不对:
[[43;74;21]]
不是一个3元素向量,而是一个1元素向量,其中包含一个3元素向量。您是否正确地从命令行复制粘贴了它?另外,您是说
F
应该是一个向量向量?或者是一个矩阵向量,或者是一个向量和矩阵的混合向量?所有这些数组的大小和形状都相同吗?yes、 很抱歉,这是错误的。它有一个如下所示的向量。但在主代码的其他部分,其他一些人将添加到F。然后作为一个整体,F是n维的,每个元素都是数组。此外,这些数组有不同的大小。但形状可以相同。无论如何,只要使用
推送!
,如果你关心性能,看看你是否可以将具体类型签名到struct字段,或者至少避免所有
Any
-向量。