C++ 中用于矩阵乘法的类库函数
Library like function from scratch for matrix multiplication in C++
在这里,我正在尝试为矩阵乘法编写一个类似于函数的库。而且这个函数应该支持所有的数据类型,如float、int等。这就是我在这里使用Template的原因。但是,我很难将二维数组传递给函数。
Q) 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++ 之后,我想出了一个可行的解决方案(见下文)。
Q) void matrix_mul(T a[][2], T b[][2], T c[][2], ll p, ll q, ll r) how can I pass 2d arrays without any need to pass second parameter i.e., 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) I want to write these functions in another file and then import it into the main file, just like how we import standard libraries?
标准库的所有模板都在 header 文件中定义,而不是在编译为链接 object 文件的翻译单元中。所以你必须在 header 文件中保留内联实现,而不是在 .cpp 文件中。
export template
本来是为了解决这个问题,但它从未奏效并从 C++ 中删除了。
一种可能的方法是在 .cpp 中使用您需要的所有类型来实例化模板,并在 header 中仅添加声明,但这样会因您没有预见到的参数而失败。对于您的情况,这不是一个选项,因为您需要预见所有类型 和 所有尺寸。
我就是这样解决上面的问题的-
- 在头文件中定义模板。
- 在main.cpp
#include "mat.hpp"
. 中导入上述头文件
- 使用矢量表示来克服大小规范。
我在这里发布了完整的解决方案https://github.com/ssp4all/Matrix-Multiplication-and-Transpose
在这里,我正在尝试为矩阵乘法编写一个类似于函数的库。而且这个函数应该支持所有的数据类型,如float、int等。这就是我在这里使用Template的原因。但是,我很难将二维数组传递给函数。
Q) 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++ 之后,我想出了一个可行的解决方案(见下文)。
Q) void matrix_mul(T a[][2], T b[][2], T c[][2], ll p, ll q, ll r) how can I pass 2d arrays without any need to pass second parameter i.e., 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) I want to write these functions in another file and then import it into the main file, just like how we import standard libraries?
标准库的所有模板都在 header 文件中定义,而不是在编译为链接 object 文件的翻译单元中。所以你必须在 header 文件中保留内联实现,而不是在 .cpp 文件中。
export template
本来是为了解决这个问题,但它从未奏效并从 C++ 中删除了。
一种可能的方法是在 .cpp 中使用您需要的所有类型来实例化模板,并在 header 中仅添加声明,但这样会因您没有预见到的参数而失败。对于您的情况,这不是一个选项,因为您需要预见所有类型 和 所有尺寸。
我就是这样解决上面的问题的-
- 在头文件中定义模板。
- 在main.cpp
#include "mat.hpp"
. 中导入上述头文件
- 使用矢量表示来克服大小规范。
我在这里发布了完整的解决方案https://github.com/ssp4all/Matrix-Multiplication-and-Transpose