Mathematica中删除矩阵列的简单方法

8

我将尝试在Mathematica中删除一个矩阵。一种不太优雅的方法是像下面这样指定一个新矩阵来实现:

S = Table[
    Ss[[If[i < t, i, i + 1]]][[If[j < t, j, j + 1]]], {i, q}, {j, q}];  

目标是消除行和列t。

确实删除一行很容易Delete[Ss,t]。对于列,我想我可以这样做

Transpose[Delete[Transpose[Ss,t]]]  

我的主要关注点是以最快的方式执行它。

更一般地说,是否有一个Mathematica运算符可以像对行一样轻松地对矩阵列进行切片和分解,而不必求助于转置?

1个回答

14
我想您正在寻找的是:
Drop[Ss,{t},{t}]  

时间:

ClearAll["Global`*"];

First@Timing[a = RandomInteger[1000, {5000, 5000}];]
0.34

First@Timing[Drop[a, {2}, {2}]]
0.11

First@Timing[Transpose@Delete[Transpose@Delete[a, 2], 2]]
0.5

7
这看起来大致正确,可以删除一行和一列(我想这就是所请求的)。如果只删除一列,请使用Drop[mat,None,{colnum}]。 - Daniel Lichtblau
@Daniel 谢谢。重新阅读问题的最后一部分,我想知道你的评论是否是 OP 想要的。不过我不确定。 - Dr. belisarius
@belisarius,@daniel,非常感谢。由于字符限制,我正在提出一个新问题来扩展我在这里提出的问题。 - Phil
1
请查看:https://dev59.com/EFXTa4cB1Zd3GeqPzTN4 - Phil
另一方面,如果我想从矩阵中删除不连续的列,可以使用TransposeDelete相对直观地完成。比如,如果我有一个{10x10}的矩阵,并且我想要删除第2、4和8列,一种可能的方法是:mydata = Array[Subscript[a, ##] &, {10, 10}]; Transpose@Delete[Transpose@mydata, {{2}, {4}, {8}}]。也可以使用Drop来完成,例如Drop[Drop[Drop[mydata, None, {2}], None, {3}], None, {6}],但这很麻烦。有没有更好的方法来从矩阵中删除不连续的列呢? - 681234
1
请查看wreach提供的非常好的方法,链接在这里:https://dev59.com/EFXTa4cB1Zd3GeqPzTN4#5300892 - 681234

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