gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:54:11 25 4
gpt4 key购买 nike

这个问题在某种程度上是我在这里提出的问题的延续: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) =表[A[[ik]][[jl]],{k,p},{l,q}]

我们注意到 Ic={i'1,...,i'p'}=补码[{1,...,长度[A]} ,{i1,...,ip}];Jc={j'1,...,j'q'}=补码[{1,...,长度[ A]},{j1,...,jq}];

DropOperator[A,{i1,..,ip},{j1,...,jq}]=(A[[ik]][[jl]]) (1<=k'<=p' , 1<=l'<=q') =表[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 的使用,我也考虑过使用它,但是当我检查文档时,没有建议按照@的方式完成它贝利撒留和@daniel 建议。如果文档可以在未来的版本中朝这个方向更新,那将会很有帮助。

最佳答案

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

关于matrix - 在 Mathematica 中选择/删除矩阵中的行/列列表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5299798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com