我如何消除等于 if 条件的行

how i can eliminate the row which equal those if conditions

function prealloc()
situation=zeros(Int64,3^5,5);
i=1;
for north=0:2, south=0:2, east=0:2, west=0:2, current=0:2
    situation[i,:]=[north, south, east, west, current]
if situation[i,:]=[2, 2, 2, 2, 2]
elseif  situation[i,:]=[2, 2, 2, 2, 1]
elseif situation[i,:]=[2, 2, 2, 2, 0]`enter code here`


end
    i+=1
end
situation
end

如何从调用 situation

的数组中删除等于 if 条件的行

您不能在 Julia 中只删除一行,唯一的方法是创建一个数组副本,但不包含要删除的行。而且我认为这不是内部实施的,而是故意的。

因此您必须手动执行此操作,类似这样的操作将创建 situation 的副本,但不包含 i 行(这与删除行 i 不同) =14=]).

situation = vcat(situation[1:i-1,:],situation[i+1:end,:])

此外,这实际上会在每次迭代中改变 situation 的尺寸,所以要小心...

另外 2,您的循环将以边界错误结束,因为最终它将超出您的数组的限制,也许您可​​以编写类似这样的代码来结束循环。

if i = length(situation)
    break
else
   i += 1
end

最终,您可以创建一个函数 delrow 并在您的循环中调用它:

function delrow(array,row)
    return vcat(array[1:row-1,:],array[row+1:end,:])
end

然后调用situation = delrow(situation,i)

首先要做的事情是:您问题中的代码没有 运行(出于多种原因)。在问题中发布代码时,最好将其置于 "working example" 形式,用户可以将其复制并粘贴到他们选择的编辑器中,并且无需用户对您的内容进行有根据的猜测实际上正在尝试做。这可能是该问题获得否决票的原因之一。

除此之外,有两种方法可以完成您想要做的事情:

1) 在第一步中构建没有指定行的矩阵。那么你以后就不用担心 "deleting the rows" 了。对于像问题中这样简单的情况,你可以这样做:

function prealloc()
    x = zeros(Int, 3^5 - 3, 5)
    i = 1
    for n=0:2, s=0:2, ea=0:2, w=0:2, cur=0:2
        if !([n, s, ea, w, cur] == [2, 2, 2, 2, 2] || [n, s, ea, w, cur] == [2, 2, 2, 2, 1] || [n, s, ea, w, cur] == [2, 2, 2, 2, 0])
            x[i, :] = [n, s, ea, w, cur]
            i += 1
        end
    end
    return(x)
end

注意我使用的是 Int,而不是 Int64。这不会影响性能,这意味着您的代码将 运行 在 32 位和 64 位架构上。

另一个风格提示。不要使用分号来结束行。这是 Matlab 的怪癖,在 Julia 中不需要。

2) 正如其他用户所建议的那样,您可以构建整个矩阵(包括不需要的行),然后在稍后删除它们。当然,这需要重新分配整个矩阵,因此效率有点低(注意,您可以就地删除 vectors 的元素,即无需重新分配,但不能删除任何数组维度 2 或更大)。在这种情况下,为了鼓励代码重用,将例程分解为三个独立的函数是有意义的。首先,我们分配整个矩阵:

function prealloc1()
    x = zeros(Int64,3^5,5)
    i = 1
    for north=0:2, south=0:2, east=0:2, west=0:2, current=0:2
        x[i,:]=[north, south, east, west, current]
        i += 1
    end
    return(x)
end

接下来,我们获得了我们希望删除的索引向量。我们将此作为单独的步骤进行,因为我们只想重新分配矩阵一次,而不是每次找到要删除的新行时都重新分配。对于您的情况,您可以使用这样的函数:

function findCondition(x::Matrix{Int})
    inds = Array(Int, 0)
    for i = 1:size(x, 1)
        if x[i, :] == [2 2 2 2 2]
            push!(inds, i)
        elseif  x[i, :] == [2 2 2 2 1]
            push!(inds, i)
        elseif x[i, :] == [2 2 2 2 0]
            push!(inds, i)
        end
    end
    return(inds)
end

请注意,在此函数的比较语句中,我使用 [2 2 2 2 2] 而不是 [2, 2, 2, 2, 2]。这是因为第一个构造是二维数组(类型 Matrix),而第二个是一维数组(类型 Vector)。由于 x[i, :] 属于 Matrix 类型,所以区别很重要。

最后,我们需要重新分配没有违规行的矩阵。正如用户@Matt B. 建议的那样,这可以通过以下单行函数来完成:

removeIndices(x::Matrix{Int}, inds::Vector{Int}) = x[setdiff(IntSet(1:size(x, 1)), IntSet(inds)), :]

注意,在这里将 setdiff 应用到 IntSet 很快,因为通过构造 inds 已经按升序排序。