3 个版本 (破坏性更新)
0.3.0 | 2022年5月25日 |
---|---|
0.2.0 | 2022年2月17日 |
0.1.0 | 2022年2月11日 |
#1330 in 数学
33KB
577 行
nnls
这是nnls(非负最小二乘法)的Rust版本。它是从Fortran90脚本移植过来的,该脚本由scipy.optimize.nnls和其他几个库使用。
为什么?
我决定将nnls移植到Rust,因为
- nnls的C版本不是线程安全的!代码中有几个
static
变量,这使得它在并行环境中无法使用。如果您计划只使用单线程的nnls,您可能更喜欢链接到那个版本:它已经过大量测试,没有已知问题。 - Fortran版本(77和90)需要一些Fortran内存模型的知识和一些编译器技巧才能成功链接。我没有做到这一点,而且我不想在这个冒险中浪费更多时间,所以我只是将脚本移植到了Rust。
优势
- 它已经被使用了几百万次,很快将会被使用数十亿次。我处理3D图像,我看到的每一张图像都包含大约100万个体素。对于特定的算法,我需要为每个体素调用
nnls
2次。其中一些图像已经过测试并与原始Fortran版本进行了比较。 - 没有
unsafe
,并且在这个crate中禁止使用。
问题
- 这不是典型的Rust。我试图清理和增强代码,但并不总是可能。
- 我使用了ndarray。您可能更喜欢其他一些东西。我目前不打算改变这一点,但欢迎讨论。
- 代码中目前有1个
panic!
,因为原始代码中有1个使用goto
的代码路径,我无法正确转换为Rust。我计划处理这种情况,但后来发现它从未被调用。正如我写的,nnls
已经被广泛使用,我找不到任何数据集可以触发该条件。如果我的程序因为这个问题而崩溃,它将很快得到修复。
依赖关系
~3.5MB
~59K SLoC