如何在Julia中删除矩阵的一行

16
在Julia中删除矩阵A的第二行是:

deleteat!(A, 2)

请注意,此代码不会返回新的矩阵A,而是在原地修改它。如果您想要一个新的矩阵,可以使用以下代码:

B = A[setdiff(1:size(A, 1), 2), :]


1
你为什么打上了 [tag:matlab] 的标签?这与MatLab毫无关系。 - James Mertz
4
实际上,我认为这仍然与MATLAB有关,就像其他许多比较问题一样(例如“如何在Python中执行此MATLAB操作?”)... - Eitan T
1
一个快速的更新:对于向量,Julia v0.3有deleteat!函数,非常快。对于矩阵/数组,您仍然需要使用@EitanT的解决方案。 - Colin T Bowers
4个回答

21

你不能从矩阵中删除一行- Matlab有简单的语法,但事实上删除一行的方式是创建一个没有该行的副本,因此我们决定明确这一点,以便具有更透明的性能特征。您可以更改1维数组的大小,例如使用push!(v,x)pop!(v)


1
更糟糕的是,在MATLAB中,对行/列切片进行复制(即使MATLAB使用列为主序,因此在列索引情况下,为原始矩阵创建视图会很容易)。我认为这些情况的例外是A(:)reshape(A,..)以及某些permute(A,..)的情况。 - Amro
只是我的两分钱看法:我认为对于那些严肃关注性能的人,这个功能带来的性能影响不会太让人惊讶,并且这个功能确实非常棒。例如,我的一位朋友通常对R没有任何好话,但他真的很喜欢你可以使用noRow10Mat = mat[-10,]这样的语句。 - Cliff AB
Julia在切片时也会复制:临时变量必须放在某个地方...你可以通过索引创建迭代器,而不改变数组的存储方式。但是,需要在数组旁边存储和维护索引结构,这将很快变得混乱。没有简单的方法可以避免复制和分配某些内容。因此,我们有哈希表——如果您经常更改其大小,则速度更快;如果要进行大量访问,则速度较慢——就像矩阵数学运算一样。你选择你的数据结构... - Lewis Levin

11

6
你可以直接使用 end。我经常使用 A[setdiff(1:end, 2), :],但是使用 1:end .!= 2 进行索引可能会更快。回答很好。 - mbauman

6

我对Julia一无所知,但我认为它使用方括号 ([]) 进行索引,因此您应该尝试以下操作:

A[2, :] = []

我手头没有Julia解释器来测试,但如果那也失败了,下面的方法应该能够解决:

A = A[[1, 3:end], :]

这只是使用相反的策略来选择您想要保留的行。


我认为Eitan是正确的,在这份文档中可以找到更多信息... http://docs.julialang.org/en/latest/manual/arrays/ - bla
3
Julia区分一维数组和一行N列的数组。您应该编写 A[[1,3:end],:](用逗号连接):http://docs.julialang.org/en/latest/manual/getting-started/#noteworthy-differences-from-matlab 。建议的第一个解决方案无效。 - Amro
2
这个答案已经过时了,截至2020年,Thuener的回答是正确的。 - Hansang

0

以下内容适用于Julia 1.7.2

 a = [1 2 3; 4 5 6; 7 8 9]
 a[Not(1), :]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接