Efficient way to pick/delete a list of rows/columns in a matrix in Mathematica

前端 未结 2 1491
生来不讨喜
生来不讨喜 2020-12-17 05:04

This question is in a way a continuation of the question I asked here:Simple way to delete a matrix column in Mathematica to which @belisarius and @Daniel provided very help

相关标签:
2条回答
  • 2020-12-17 05:29

    Part directly supports lists of indices when slicing arrays. The following definitions exploit that:

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

    Example use:

    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 *)
    
    0 讨论(0)
  • 2020-12-17 05:36

    You can also use explicit ranges in a way that is fairly efficient. They may provide some more flexibility. Here is your example.

    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

    I would also suggest use of Span except offhand I do not see how to get it to work in this setting.

    Daniel Lichtblau Wolfram Research

    0 讨论(0)
提交回复
热议问题