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

Wolfram mathematica 使用Delete从方形矩阵中删除行和列,wolfram-mathematica,Wolfram Mathematica,给定:平方矩阵和列表,表示要删除的行的索引,同时也表示要删除的列的索引(它是平方矩阵,因此只需要一个列表) 输出:删除列表中的行和列的方形矩阵 假设索引列表有效 这是一个例子 所以上面说删除第二行和第四行,以及第二列和第四列 我不知道如何使用Delete[]同时删除行和列,我真的不想列出我要删除的每个元素索引 但是我可以使用Delete删除行 下面是我如何解决它的,我先移除行,然后转置矩阵,然后移除新矩阵的行(这将是原始矩阵的列),然后转置结果以获得我想要的 像这样: a = {{0, 5,

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

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

假设索引列表有效

这是一个例子

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

我不知道如何使用
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
我的问题:是否有一种使用Delete(或其他专家技巧)的较短方法可以更好地执行此操作?


谢谢

你当然可以用Drop做你的例子:

Drop[a, {2, 4, 2}, {2, 4, 2}] // MatrixForm

我不知道这有多普遍,但它可能会帮助您朝着正确的方向前进。

如果您想删除相同的索引列和行,我将使用
部分
。例如,要查看删除了第2列和第4行的
a

a[[{1, 3, 5, 6}, {1, 3, 5, 6}]] // MatrixForm
为了使它更通用,您可以创建一些东西,将
DeleteCases
Range
和列/行索引列表结合起来,但在没有更多信息的情况下,我还没有尝试这样做

编辑

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}}

针对实际问题测试这两种方法。

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

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}

这比
Part
方法效率低得多,但我发现它更透明,而且有时更重要

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

谢谢,但上面的方法不起作用。您使用的是“在步骤2上”选项。这在本例中非常具体,它起作用,但它需要在行/列列表上工作,并且可能不总是按步骤2左右。我只是一个例子。@Nasser,我计算了很多,因此是限定符。是的,这更好。我被固定住了使用
Delete
,因为我生成的是要删除的行/列的列表。但是我可以很容易地补充此列表以获得不删除的行的列表,然后使用
Part
,如您所示。这似乎是一个很好的解决方案。比我拥有的要好得多。我想我需要更多的咖啡,因为我应该想到这一点:)在上面使用
complete[length,pos]
可能比使用
DeleteCases[Range[length],alternations@@pos]
要简单一些,这取决于列表的长度,我想你可以比较一下现实世界中的问题的一些计时,看看什么是最好的。当然,我的意思是写上面的
complete[Range[length],pos]
。(很难在这么小的窗口中编写代码)这个问题的副本:。投票结束这里的类似问题:问题,在Mathematica中选择/删除矩阵中的行/列列表的有效方法,也是相关的,特别是由RirachHello Chris提出的,我们有一个SE网络下的a提案,用于任何与mma相关的问题(不仅仅是编程问题等)。我们很快就要发布了(剩下24个用户),如果你能承诺这个建议,那就太好了:)+1,很好。太糟糕了,不能像那样写
Delete[a,{{2},{4},{2},{4}]
。但是你用
:>Sequence[]
替换这些部件的技巧是我没有想到的。我仍然不确定它是如何工作的,但它确实如此。我也认为你的解决方案更自然。许多Mathematica命令,以及许多使用它们的方法!我想我会把你的方法添加到Mathematica.btw中关于矩阵的备忘单中,尽管这种方法更自然,但我认为对于自动化来说,它似乎不难使用?需要更多的代码。原因是要保留(或通过补码删除)的行/列列表可能很长,并且可以作为运行代码的一部分动态生成。因此,要使用上述方法,需要编写额外的代码来生成命令的
{{n1},{n2}…},{uu,n1},{uu n2}}…}
部分,因为所涉及的列表将是一个变量。谢谢