这个问题在某种程度上延续了我在这里提出的问题: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和@的方式完成它丹尼尔建议道。如果在将来的版本中可以在该方向上更新文档,那将会很有帮助。
答案 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