Matrix Mathematica中选择/删除矩阵中行/列列表的有效方法

Matrix Mathematica中选择/删除矩阵中行/列列表的有效方法,matrix,wolfram-mathematica,Matrix,Wolfram Mathematica,这个问题在某种程度上延续了我在这里提出的问题:@belisarius和@Daniel提供了非常有用的答案 我通常试图做的是从矩阵中提取特定的行和列,或者删除指定的行和列后剩下的内容。所以这可以正式写为,find TakeOperator和Drop Operator,这样: TakeOperator[A,{i1,…,ip},{j1,…,jq}]=(A[[ik][[jl]])(1您还可以以相当有效的方式使用显式范围。它们可能提供一些更大的灵活性。下面是您的示例 a = RandomInteger[1

这个问题在某种程度上延续了我在这里提出的问题:@belisarius和@Daniel提供了非常有用的答案

我通常试图做的是从矩阵中提取特定的行和列,或者删除指定的行和列后剩下的内容。所以这可以正式写为,find TakeOperator和Drop Operator,这样:


TakeOperator[A,{i1,…,ip},{j1,…,jq}]=(A[[ik][[jl]])(1您还可以以相当有效的方式使用显式范围。它们可能提供一些更大的灵活性。下面是您的示例

a = RandomInteger[1000, {5000, 5000}];

Timing[b = Drop[a, {101}, {101}];]
Out[66]={0.041993,Null}

Timing[
  c = a[[Join[Range[100], Range[102, 5000]], 
   Join[Range[100], Range[102, 5000]]]];]
Out[67]={0.061991,Null}

c == b
Out[62]=真

我还建议使用Span,但我不知道如何在这种环境下工作

丹尼尔·利奇布劳
Wolfram Research在切片数组时直接支持索引列表。以下定义利用了这一点:

takeOperator[a_?MatrixQ, rows_List, cols_List] :=
  a[[rows, cols]]

dropOperator[a_?MatrixQ, rows_List, cols_List] :=
 a[[##]]& @@ complementaryIndices[a, rows, cols]

complementaryIndices[a_?MatrixQ, rows_List, cols_List] :=
  Complement @@@ Transpose @ {Range /@ Dimensions @ a, {rows, cols}}
示例用法:

a = RandomInteger[1000, {5000, 5000}];
First @ Timing @ takeOperator[a, Range[1, 5000, 2], Range[1, 5000, 2]]
(* 0.016 *)

First @ Timing @ dropOperator[a, Range[1, 5000, 2], Range[1, 5000, 2]]
(* 0.015 *)

您应该查看帮助中的“更多信息”部分。那里有有用的信息。在Drop help条目中,您可以找到
{n}仅元件n
:D@belisarius:是的。刚刚看到它。虽然感觉有点迷失在迷宫中…谢谢。这种感觉很正常。学习导航帮助系统需要时间,而且功能清单也很简单huge@WReach:谢谢。说到点子上。我认为如果WRI能够无缝地集成一些在中为她提供的choice支持,那将是很有帮助的其软件文档说明了mathematica各种功能的使用。
a = RandomInteger[1000, {5000, 5000}];
First @ Timing @ takeOperator[a, Range[1, 5000, 2], Range[1, 5000, 2]]
(* 0.016 *)

First @ Timing @ dropOperator[a, Range[1, 5000, 2], Range[1, 5000, 2]]
(* 0.015 *)