首页 > 解决方案 > C++中矩阵乘法的库之类的函数

问题描述

在这里,我正在尝试为矩阵乘法编写一个类似函数的库。而且这个函数应该支持所有的数据类型,比如float、int等。这就是我在这里使用Template的原因。但是,我很难将二维数组传递给函数。

问)void matrix_mul(T a[][2], T b[][2], T c[][2], ll p, ll q, ll r)如何在不需要传递第二个参数的情况下传递二维数组,即T a[][2]

Q) 我想把这些函数写在另一个文件中,然后导入到主文件中,就像我们导入标准库一样?

PS:我是CPP的新手。如果这些问题已经得到解答,请引导我访问资源。TIA

template <class T>
void matrix_mul(T a[][2], T b[][2], T c[][2], ll p, ll q, ll r){
    for (ll i = 0; i < p; ++i)
        for (ll j = 0; j < q; ++j)
            for (ll k = 0; k < r; ++k)
                c[i][j] += a[i][k] * b[k][j];
}
int main(){
    io;
    ll p = 2, q = 2, r = 2;
    ll a[2][2] = {{1, 1}, {1, 1}};
    ll b[2][2] = {{1, 1}, {1, 1}};
    ll c[2][2] = {0};

    for (ll i = 0; i < p; ++i)
        for (ll j = 0; j < r; ++j)
            c[i][j] = 0;

    matrix_mul(a, b, c, p, q, r);

    for (ll i = 0; i < p; ++i){
        for (ll j = 0; j < r; ++j)
            cout << c[i][j] << "\t";
        cout << nl;
    }
    return 0;   
}

更新:阅读 C++ 之后,我想出了一个可行的解决方案(见下文)。

标签: c++functionmatrix-multiplication

解决方案


Q) void matrix_mul(T a[][2], T b[][2], T c[][2], ll p, ll q, ll r) 我怎样才能传递 2d 数组而不需要传递第二个参数,即 T a[][2]?

使用参考和每个尺寸大小作为其他模板参数

template<class T, ll  N, ll M>
void matrix_mul(T (&a)[N][2], T (&b)[N][M], T (&c)[N][M], ll p, ll q, ll r)

将推导出这些参数的值,与推导类型的方式相同。

Q) 我想把这些函数写在另一个文件中,然后导入到主文件中,就像我们导入标准库一样?

标准库的所有模板都在头文件中定义,而不是在编译为链接目标文件的翻译单元中。因此,您必须将内联实现保留在头文件中,而不是 .cpp 文件中。

export template本来是为了解决这个问题,但它从来没有奏效,并从 C++ 中删除。

一种可能的方法是在 .cpp 中使用您需要的所有类型来实例化模板,并在标头中仅声明声明,但随后它会因您未预见到的参数而失败。对于您的情况,这不是一个选项,因为您需要预见所有类型所有尺寸。


推荐阅读