犰狳 - 矩阵乘法错误

Posted

技术标签:

【中文标题】犰狳 - 矩阵乘法错误【英文标题】:Armadillo - matrix multiplication error 【发布时间】:2015-05-04 22:07:51 【问题描述】:

我正在尝试使用 Armadillo 进行简单的矩阵乘法:

mat33 MatA, MatB, MatC;

MatA = MatB * MatC;

并出现此错误:

 C:\...SFunction.cpp:21: error: C2666: 'arma::Mat<eT>::operator =' : 3 overloads have similar conversions
    with
    [
        eT=double
    ]
    c:\...\include\armadillo\armadillo_bits/Mat_bones.hpp(724): could be 'const arma::Mat<eT> &arma::Mat<eT>::fixed<fixed_n_rows,fixed_n_cols>::operator =(const arma::Mat<eT>::fixed<fixed_n_rows,fixed_n_cols> &)'
    with
    [
        eT=double,
        fixed_n_rows=3,
        fixed_n_cols=3
    ]
    c:\...\include\armadillo\armadillo_bits/Mat_bones.hpp(82): or       'const arma::Mat<eT> &arma::Mat<eT>::operator =(const arma::Mat<eT> &)'
    with
    [
        eT=double
    ]
    c:\...\include\armadillo\armadillo_bits/Mat_meat.hpp(4652): or       'const arma::Mat<eT> &arma::Mat<eT>::operator =<arma::mat33,arma::mat33,arma::glue_times>(const arma::Glue<T1,T2,glue_type> &)'
    with
    [
        eT=double,
        T1=arma::mat33,
        T2=arma::mat33,
        glue_type=arma::glue_times
    ]
    while trying to match the argument list '(arma::mat33, const arma::Glue<T1,T2,glue_type>)'
    with
    [
        T1=arma::mat33,
        T2=arma::mat33,
        glue_type=arma::glue_times
    ]

但是,当我将代码更改为:

mat33 MatA, MatB, MatC;

MatA = mat33(MatB * MatC);

一切都很好。这是进行矩阵乘法并将结果保存到其他矩阵的正确方法吗?还是有其他更简单的方法?

【问题讨论】:

看起来您正在使用 Visual Studio,已知它在遵循 C++ 标准方面存在问题。 Armadillo 需要符合标准的编译器。因此,您可能希望使用更好的 C++ 编译器,例如 gcc 或 clang。对于 Windows,您可以从 mingw project 获取 gcc。 【参考方案1】:

你为什么使用 mat33(固定尺寸)?

您可以使用普通的 mat 类。在这种情况下,乘法是无缝的

mat MatA(3,3), MatB(3,3), MatC(3,3); //or MatC;
// fill MatA, MatB
MatC = MatA * MatB

【讨论】:

以上是关于犰狳 - 矩阵乘法错误的主要内容,如果未能解决你的问题,请参考以下文章

犰狳复矩阵乘法早期逼近

犰狳:矩阵乘法精度损失

犰狳:乘法时出错

使用三种不同方法的矩阵乘法会给出不同的结果,具体取决于值的数量

为什么犰狳矩阵计算比Fortran慢得多

寻找基本矩阵(矩阵乘法错误)