首页 > 解决方案 > 如果插入顺序不同,则检查在 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.

您可以看到这两个矩阵实际上是相同的,但是项目以不同的顺序插入。

标签: rust

解决方案


事实证明,您可以转换为 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);

推荐阅读