rust - 如果插入顺序不同,则检查在 sprs 中写入 Matrix Market 格式的两个 TriMat 矩阵的相等性不起作用
问题描述
我正在尝试检查两个 Matrix Market 格式文件是否包含相同的矩阵。在我的实际代码中,由于使用了多线程,不能保证我TriMat
在序列化到磁盘之前以相同的顺序将项目插入到 a 中。结果,当我加载生成的文件并比较它们时,它们并不总是相同的。无论插入顺序如何,如何比较两个不同的.mtx
文件并确保它们相同?
示例代码:
extern crate sprs;
use sprs::io::{write_matrix_market, read_matrix_market};
use sprs::TriMat;
fn main() {
let mut mat = TriMat::new((4, 20));
let mut vals = Vec::new();
vals.push((0, 19, 1));
vals.push((1, 14, 1));
vals.push((1, 19, 1));
vals.push((2, 17, 2));
for (i, j, v) in vals {
mat.add_triplet(i, j, v)
}
let _ = write_matrix_market("a.mtx", &mat).unwrap();
let mut mat2 = TriMat::new((4, 20));
let mut vals2 = Vec::new();
vals2.push((0, 19, 1));
vals2.push((1, 14, 1));
vals2.push((2, 17, 2)); // different order
vals2.push((1, 19, 1));
for (i, j, v) in vals2 {
mat2.add_triplet(i, j, v)
}
let _ = write_matrix_market("b.mtx", &mat2).unwrap();
let seen_mat: TriMat<usize> = read_matrix_market("a.mtx").unwrap();
let expected_mat: TriMat<usize> = read_matrix_market("b.mtx").unwrap();
assert_eq!(seen_mat, expected_mat);
}
以及由此产生的错误:
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `TriMatBase { rows: 4, cols: 20, row_inds: [0, 1, 1, 2], col_inds: [19, 14, 19, 17], data: [1, 1, 1, 2] }`,
right: `TriMatBase { rows: 4, cols: 20, row_inds: [0, 1, 2, 1], col_inds: [19, 14, 17, 19], data: [1, 1, 2, 1] }`', src/main.rs:31:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.
您可以看到这两个矩阵实际上是相同的,但是项目以不同的顺序插入。
解决方案
事实证明,您可以转换为 CSR 以使其正常工作:
let seen_mat: TriMat<usize> = read_matrix_market("a.mtx").unwrap();
let expected_mat: TriMat<usize> = read_matrix_market("b.mtx").unwrap();
let a = seen_mat.to_csr();
let b = expected_mat.to_csr();
assert_eq!(a, b);
推荐阅读
- javascript - 角度显示错误:webpack CLI 加载失败
- python - 根据输入列表在每行打印适当数量的字符
- html - 溢出:隐藏在 Safari 浏览器中不起作用
- nginx - 无法在 AWS Elastic Beanstalk、AL2 上加载 Ruby 2.7.4 (Rails 6) 应用程序
- html - bootstrap 4中不可见的导航栏切换器
- reactjs - 自动导入在 vs 代码中的 typescript 项目中的反应钩子不起作用
- python - Django rest框架如何更改:“此字段可能不为空。” 错误信息
- apache-kafka - 如何使用 kafka 的消费者群体来实现领导理念?
- c# - ASP.NET Core 3.1 与 google 登录、nginx 反向代理和 docker 资源暂时不可用
- cuda - CUDA 内存库冲突