我正在实现一个简单的生锈矩阵库,我正在为标量乘法编写运算符。右乘法有效:
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)
}
}
但我似乎无法进行左乘,我假设下面的代码会做我想要的:
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())
}
}
但以下不起作用:
let A = mat![[1f64, 2., 3.], [4., 5., 6.]];
let P = A * 4f64; // works!
let Q = 4f64 * A; // error...
错误为error: mismatched types: expected `f64`, found `linalg::Mat<f64>` (expected f64, found struct linalg::Mat)
。我可以只有f64 * f64乘法,还是我接近第二种情况错了?我尝试使用impl Mul<Mat<f64>, Mat<f64>> for f64
专门针对f64实现它,但这仍然不起作用。
我发现我可以使用4f64.mul(&A)
使其工作,但这并不理想。
答案 0 :(得分:0)
也许它与声明有关:你的seconde impl declration是Mult<Mat<T>, Mat<T>>
,所以我的猜测是它允许乘以两个矩阵,这不是你想要的。
(我想发表评论,但我还不能这样做:()