gpt4 book ai didi

rust - 如果插入顺序不同,则检查以 sprs 格式写入 Matrix Market 格式的两个 TriMat 矩阵是否相等

转载 作者:行者123 更新时间:2023-11-29 08:20:27 24 4
gpt4 key购买 nike

我正在尝试检查两个 Matrix Market 格式文件是否包含相同的矩阵。在我的实际代码中,由于使用了多线程,无法保证在序列化到磁盘之前我会以相同的顺序将项目插入到 TriMat 中。结果,当我加载生成的文件并比较它们时,它们并不总是相同的。无论插入顺序如何,如何比较两个不同的 .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);

关于rust - 如果插入顺序不同,则检查以 sprs 格式写入 Matrix Market 格式的两个 TriMat 矩阵是否相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51975898/

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