使用Delete从方形矩阵中删除行和列

时间:2012-01-06 05:27:54

标签: wolfram-mathematica

给定:方形矩阵和表示要删除的行的索引的列表,它还同时表示要删除的列的索引(它是方形矩阵,因此只需要一个列表)。

输出:方形矩阵,删除列表中的行和列列。

假设有效的指数列表。

这是一个例子 enter image description here

所以上面说的是删除第二行和第四行,以及第二列和第四列。

我无法想象如何使用Delete[]同时删除行和列,我真的不想列出我想删除的每个单独的元素索引。

但我可以使用Delete删除行。

下面我如何解决它,我首先删除行,然后转换矩阵,然后删除新矩阵的行(这将是原始的列),然后将结果转换回来获取我的内容想要的。

像这样:

a = {{0, 5, 2, 3, 1, 0}, {4, 3, 2, 5, 1, 3}, {4, 1, 3, 5, 3, 2}, {4, 
    4, 1, 1, 1, 5}, {3, 4, 4, 5, 3, 3}, {5, 1, 4, 5, 2, 0}};
del = {{2}, {4}};
a = Delete[a, del];
a = Delete[Transpose[a], del];
(a = Transpose[a]) // MatrixForm

我的问题:使用删除(或其他专家技巧)是否有更短的方式以更好的方式执行此操作?

感谢

4 个答案:

答案 0 :(得分:6)

如果要删除相同的索引列和行,我会使用Part。例如,要查看a列和第2行和第4行已删除:

a[[{1, 3, 5, 6}, {1, 3, 5, 6}]] // MatrixForm

为了使它更通用,您可以创建一些将DeleteCasesRange和列/行索引组合在一起的内容,但在没有进一步信息的情况下,我没有尝试过这样做(尚)。

修改

remove[a_?MatrixQ, pos_List] := Module[{tmp, length = Length[a]},

  tmp = DeleteCases[Range[length], Alternatives @@ pos];

  a[[tmp, tmp]]

  ]

remove[a,{2,4}]
{{0, 2, 1, 0}, {4, 3, 3, 2}, {3, 4, 3, 3}, {5, 4, 2, 0}}

<强> EDIT2

remove2[a_?MatrixQ, pos_List] := Module[{tmp, length = Length[a]},

  tmp = Complement[Range[length], pos];

  a[[tmp, tmp]]

  ]

remove2[a,{2,4}]
{{0, 2, 1, 0}, {4, 3, 3, 2}, {3, 4, 3, 3}, {5, 4, 2, 0}}

针对您的真实世界问题测试这两个问题。

答案 1 :(得分:4)

这应该是一种比双转置方法更快的删除行的方法:

a = {{0, 5, 2, 3, 1, 0},
     {4, 3, 2, 5, 1, 3},
     {4, 1, 3, 5, 3, 2},
     {4, 4, 1, 1, 1, 5},
     {3, 4, 4, 5, 3, 3},
     {5, 1, 4, 5, 2, 0}};
del = {{2}, {4}};

a = MapThread[Delete, {a, Table[del, {Length[a]}]}]

时间有所不同,但在这个有点人为的例子中它更快:

a = Table[RandomReal[], {1000}, {10000}];
del = Map[List, Union[Table[RandomInteger[{1, 10000}], {100}]]];
Timing[Transpose[Delete[Transpose[a], del]];]

{0.25,Null}

Timing[MapThread[Delete, {a, Table[del, {Length[a]}]}];]

(0.125,Null}

答案 2 :(得分:1)

这比Part方法效率低得多,但我觉得它更透明,有时候更重要。

ReplacePart[a, {{2}, {4}, {_, 2}, {_, 4}} :> Sequence[]]

答案 3 :(得分:0)

你当然可以用Drop:

做你的例子
Drop[a, {2, 4, 2}, {2, 4, 2}] // MatrixForm

我不知道这是多么普遍,但也许它会帮助你朝着正确的方向前进。