从 Nim 中的 Neo 矩阵中选择任意行?
Selecting arbitrary rows from a Neo matrix in Nim?
我在 Nim 中使用 Neo 线性代数库,我想从矩阵中提取任意行。
我可以根据 README 中的示例显式 select 连续的行序列,但不能 select 不相交的行子集。
import neo
let x = randomMatrix(10, 4)
let some_rows = @[1,3,5]
echo x[2..4, All] # works fine
echo x[some_rows, All] ## error
第一个 echo
有效,因为您正在创建一个 Slice object,neo 已为其定义了一个过程。第二个 echo
使用整数序列,这种访问在 neo 库中没有定义。不幸的是,切片定义了连续的封闭范围,您甚至不能指定 steps 到 iterate 比一个更大的增量,所以没有办法完成什么你要。
看一下Matrix的结构,似乎为了避免复制数据而进行了高度优化。矩阵变换操作好像是复用了之前矩阵的数据,改变了access/dimensions。因此,具有任意随机的矩阵转换是不可能的,您示例中的索引专门访问非连续数据,这需要在新结构中以某种方式编码。另外,如果您编写了 @[1,5,3]
,那将破坏任何类型的正常迭代循环。
当然,另一种方法是编写一个 proc,它接受一个序列而不是一个切片,然后构建一个新的矩阵,从旧矩阵复制数据。这意味着性能损失,但如果您认为这是对库 please request it in the issue tracker of the project 的一个很好的补充。如果不被接受,那么你就需要自己写一个这样的proc供你的程序使用。
我在 Nim 中使用 Neo 线性代数库,我想从矩阵中提取任意行。
我可以根据 README 中的示例显式 select 连续的行序列,但不能 select 不相交的行子集。
import neo
let x = randomMatrix(10, 4)
let some_rows = @[1,3,5]
echo x[2..4, All] # works fine
echo x[some_rows, All] ## error
第一个 echo
有效,因为您正在创建一个 Slice object,neo 已为其定义了一个过程。第二个 echo
使用整数序列,这种访问在 neo 库中没有定义。不幸的是,切片定义了连续的封闭范围,您甚至不能指定 steps 到 iterate 比一个更大的增量,所以没有办法完成什么你要。
看一下Matrix的结构,似乎为了避免复制数据而进行了高度优化。矩阵变换操作好像是复用了之前矩阵的数据,改变了access/dimensions。因此,具有任意随机的矩阵转换是不可能的,您示例中的索引专门访问非连续数据,这需要在新结构中以某种方式编码。另外,如果您编写了 @[1,5,3]
,那将破坏任何类型的正常迭代循环。
当然,另一种方法是编写一个 proc,它接受一个序列而不是一个切片,然后构建一个新的矩阵,从旧矩阵复制数据。这意味着性能损失,但如果您认为这是对库 please request it in the issue tracker of the project 的一个很好的补充。如果不被接受,那么你就需要自己写一个这样的proc供你的程序使用。