Rust 看不到我重载的 f64 乘法运算符

nit*_*ous 5 operator-overloading multiplication matrix-multiplication rust

我正在 Rust 中实现一个简单的矩阵库,目前正在编写用于标量乘法的运算符。右乘的工作原理:

impl<T: Num + Zero + Clone + Float> Mul<T, Mat<T>> for Mat<T> {
    fn mul(&self, rhs: &T) -> Mat<T> {
        self.componentwise(|v| v.clone() * *rhs)
    }
}
Run Code Online (Sandbox Code Playgroud)

但我似乎无法进行左乘,我假设以下代码可以完成我想要的操作:

impl<T: Num + Zero + Clone + Float> Mul<Mat<T>, Mat<T>> for T {
    fn mul(&self, rhs: &Mat<T>) -> Mat<T> {
        rhs.componentwise(|v| *self * v.clone())
    }
}
Run Code Online (Sandbox Code Playgroud)

但以下方法不起作用:

let A = mat![[1f64, 2., 3.], [4., 5., 6.]];
let P = A * 4f64; // works!
let Q = 4f64 * A; // error...
Run Code Online (Sandbox Code Playgroud)

错误是error: mismatched types: expected `f64`, found `linalg::Mat<f64>` (expected f64, found struct linalg::Mat)。我只能进行 f64 * f64 乘法吗?或者我对第二种情况的处理是错误的吗?我尝试专门使用 f64 来实现它impl Mul<Mat<f64>, Mat<f64>> for f64,但这仍然不起作用。

我发现我可以使用它使其工作4f64.mul(&A),但这并不理想。

lth*_*hms 0

也许它与声明有关:您的 secondary impl 声明是 for Mult<Mat<T>, Mat<T>>,所以我的猜测是它允许将两个矩阵相乘,这不是您想要的。

(我想发表评论,但我还不能这样做:()