Rust 有没有一种方法可以写入nalgebra矩阵的整行/整列?

Rust 有没有一种方法可以写入nalgebra矩阵的整行/整列?,rust,Rust,我使用DMatrixstruct来分配动态大小的矩阵,在这里,我使用L2范数通过规范化的列向量重复覆盖每一列 //a是任意大小的数据矩阵 设col_0=a列(0); 设_col_0的norm_=col_0.normalize(); 而不是在当前列中的每个单元格上循环: let row=a.shape().0; 设col=a.shape().1; 对于0..ncol中的列{ 设_col的norm_=a.column(col).normalize(); 对于0..nrows中的行{ *a、 索引_

我使用
DMatrix
struct来分配动态大小的矩阵,在这里,我使用L2范数通过规范化的列向量重复覆盖每一列

//a是任意大小的数据矩阵
设col_0=a列(0);
设_col_0的norm_=col_0.normalize();
而不是在当前列中的每个单元格上循环:

let row=a.shape().0;
设col=a.shape().1;
对于0..ncol中的列{
设_col的norm_=a.column(col).normalize();
对于0..nrows中的行{
*a、 索引_mut((行,列))=_col()的范数[row];
}
}
我想直接用规范化版本覆盖该列。代码在语义上应该如下所示:

*a.index_mut((u,col))=norm_of_col();
其中,
(\uu,col)
表示我选择列
col
\uu
表示整行

更一般地说,有没有办法用大小和数据类型相同的新行或新列覆盖行或列? 方法as
insert\u columns
仅向现有矩阵添加列


如果是这样,那么计算速度会更快,还是我应该编写一个助手方法,在每个单元格上循环以更新矩阵?

您可以使用
nalgebra
0.18.0:

使用nalgebra::DMatrix;
fn main(){
设mut m=DMatrix::from_vec(2,3,(0..6).map(|n | n为f64.collect());
dbg!(&m);
对于m列中的多个列{
设normalized=col.normalize();
col.copy_from(&标准化);
}
dbg!(&m);
}
与你的代码相比,我还没有衡量过这段代码的性能

请注意,
copy_from
在每个步骤中都会检查项目而不检查边界,而是在循环之前只检查一次。我还没有检查优化器是否可以在代码中执行等效的转换。在我的机器上,这个简单的基准为这个答案中的解决方案提供了优势(不确定它的代表性如何;通常的基准免责声明适用):

使用准则:{黑盒,准则组,准则主,基准,准则};
使用nalgebra::DMatrix;
fn规范化库(m:&mut-DMatrix){
对于m列中的多个列{
设normalized=col.normalize();
col.copy_from(&标准化);
}
}
fn规格化\u手动\u轧制(a:&mut DMatrix){
设nrows=a.shape().0;
设ncols=a.shape().1;
对于0..ncol中的列{
设_col的norm_=a.column(col).normalize();
对于0..nrows中的行{
*a、 索引_mut((行,列))=列[行]的范数;
}
}
}
fn基准(c:&mut标准){
设mut m0=DMatrix::new_random(100100);
设mut m1=m0.clone();
让bench=Benchmark::new(“lib”,move | b | b.iter(| | normalize_lib(黑盒(&mut m0)))
.使用|u功能(“手动|u滚动”,移动| b|{
b、 iter(| |标准化|手工轧制(黑盒(&mut m1)))
});
c、 台架(“正常化”,台架);
}
标准组!(长凳、基准);
梅因!(长凳);
normalize/lib时间:[26.102 us 26.245 us 26.443 us]
正常化/手动轧制时间:[37.013 us 37.057 us 37.106 us]

它可以工作,而且使用起来肯定比在每个单元格上循环要好得多。尽管如此,内部
copy_from
也会在输入的单元格上循环。所以我假设它不会比我的版本快很多。链接到源代码:在循环之前只执行一次检查-这是对编译器的一个“典型”提示,它经常帮助省略多个边界检查,因此这是非常可能的。