我如何消除等于 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
已经按升序排序。
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
已经按升序排序。