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

时间:2011-03-14 14:16:26

标签: matrix wolfram-mathematica

这个问题在某种程度上延续了我在这里提出的问题:Simple way to delete a matrix column in Mathematica @ belisarius和@Daniel提供了非常有用的答案。

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

TakeOperator [A,{i1,..,ip},{j1,...,jq}] =(A [[ik]] [[jl]])(1< = k< = p,1< ; = l< = q)= Table[A[[ik]][[jl]],{k,p},{l,q}]

我们注意到Ic = {i'1,...,i'p'} = Complement [{1,...,Length[A]},{i1,...,ip }];的Jc = {j'1,...,j'q'} = Complement [{1,...,Length[A]},{J1,...,JQ}] ;

DropOperator [A,{i1,..,ip},{j1,...,jq}] =(A [[ik]] [[jl]])(1< = k'< = p ',1< = l'< = q')= Table[A[[ik']][[jl']],{k',p'},{l','q}]

虽然如上所述的Table可以解决问题,但以这种方式使用Table是非常低效的。

只是提出一个想法,我拿了@ belisarius的例子:

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

Out:0.218

In:Clear[b,c]

In:First@Timing[
  b = Table[
    If[i < 100, If[j < 100, a[[i]][[j]], a[[i]][[j + 1]]], 
     If[j < 100, a[[i + 1]][[j]], a[[i + 1]][[j + 1]]]], {i, 
     4999}, {j, 4999}]]

Out:140.807

In:First@Timing[c = Drop[a, {100}, {100}]]

Out:0.093

In:c===b

Out:True

注意:关于Drop在早期帖子中的使用,我也考虑过使用它,但是当我检查文档时,没有任何建议按照@belisarius和@的方式完成它丹尼尔建议道。如果在将来的版本中可以在该方向上更新文档,那将会很有帮助。

2 个答案:

答案 0 :(得分:8)

切片数组时,

Part直接支持索引列表。以下定义利用了:

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 *)

答案 1 :(得分:3)

您还可以以相当高效的方式使用显式范围。它们可以提供更多的灵活性。这是你的例子。

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] = True

我还建议使用Span除了offhand我不知道如何让它在这个设置中工作。

Daniel Lichtblau Wolfram Research