从头开始的类库函数,用于C ++中的矩阵乘法

问题描述 投票:0回答:1

[这里,我正在尝试为矩阵乘法编写类似库的函数。并且此函数应该支持所有数据类型,例如float,int等。这就是为什么我在这里使用Template的原因。但是,我很难将2d数组传递给函数。

Q)void matrix_mul(T a[][2], T b[][2], T c[][2], ll p, ll q, ll r)如何传递2d数组而无需传递第二个参数,即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++ function matrix-multiplication
1个回答
0
投票

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中所需的所有类型实例化模板,并仅在标头中声明,但是如果未预想到的参数将失败。对于您的情况,这不是一个选择,因为您需要预见所有类型的[[和所有尺寸。

© www.soinside.com 2019 - 2024. All rights reserved.