c++ - 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++ 之后,我想出了一个可行的解决方案(见下文)。
解决方案
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 中使用您需要的所有类型来实例化模板,并在标头中仅声明声明,但随后它会因您未预见到的参数而失败。对于您的情况,这不是一个选项,因为您需要预见所有类型和所有尺寸。
推荐阅读
- c# - 使用带有动态匿名对象的 NHibernate 在 GroupBy 查询中进行选择
- excel - 将字符串转换为时间并比较其中 2 个
- docker - Docker 嵌入式 DNS 服务器未按预期工作
- r - R脚本按组聚合行作为没有R包的字符连接
- java - 为什么自动配置类的顺序不同?
- .net - newtonsoft json 序列化程序无缘无故删除“ID”并添加 $id
- c# - 使用自定义 ActionBar 布局创建 AppCompat 主题
- java - 没有 ServletContext 设置尝试使用码头网络服务器启用 Spring MVC
- python - 使用 paramiko 不在远程机器上执行 cqlsh 命令
- regex - 如何在 Dockerfile 中使用正则表达式和 COPY 函数