c++ - c++中的简单矩阵求幂
问题描述
所以我被要求将矩阵定义为:
typedef vector<double> vec;
typedef vector<vec> matrix;
并在此基础上编写一些函数,如标量乘法、加法等。除幂运算外,一切都很好,我不知道是什么导致了这个函数出现问题。首先,我将乘法定义为:
void multip(const matrix& A, const matrix& B, matrix& result){
int n = A.size();
for (int i = 0; i<n; i++){
for (int j = 0; j<n; j++){
for (int k = 0; k< n; k++){
result[i][j] += A[i][k] * B[k][j];
}
}
}
}
并基于此,我想制作一个递归(这是必须的)求幂函数,如下所示:
void expo(matrix& M, unsigned n){
if (n>0){
n--;
multip(M, expo(M, n), M);}
else{return;}
}
这不起作用,返回 [Error] Invalid use of void 表达式。我明白为什么这不起作用,但我不知道如何解决这个问题。有人可以帮我解决这个问题吗?
解决方案
主要问题是它multip
改变了它的第三个参数,所以它不能和multip(M, expo(M, n), M);
你的代码中的第一个参数一样。
如果您应该使用函数返回值来返回值,那么它会变得很简单。
修复和工作示例:
#include <iostream>
#include <vector>
using namespace std;
typedef vector<double> vec;
typedef vector<vec> matrix;
matrix multip(const matrix& A, const matrix& B) {
size_t n = A.size();
matrix result(n, vec(n));
for (size_t i = 0; i < n; ++i) {
for (size_t j = 0; j < n; ++j) {
for (size_t k = 0; k < n; ++k) {
result[i][j] += A[i][k] * B[k][j];
}
}
}
return result;
}
matrix expo(matrix const& M, unsigned n) {
if(n < 1)
throw;
if(n == 1)
return M;
return multip(M, expo(M, n - 1));
}
void print(matrix const& M) {
size_t n = M.size();
for(size_t i = 0; i < n; ++i) {
for(size_t j = 0; j < n; ++j)
cout << M[i][j] << ' ';
cout << '\n';
}
}
int main() {
matrix m(2, vec(2));
m[0][0] = 2;
m[1][1] = 2;
print(m);
cout << '\n';
m = expo(m, 3);
print(m);
cout << '\n';
}
输出:
2 0
0 2
8 0
0 8
推荐阅读
- tensorflow - 如何找到二维张量的最大值索引?
- jquery - Ajax 在未填充失败数据时开始表单
- python - 如何在 django 中不使用 {% for %} 过滤查询集中的项目
- database - Postgresql 平均值和分组依据
- java - Groovy 在脚本的基类中调用意外的“get(String)”方法
- swift - 错误“冗余约束‘Self’:‘AnyObject’” - `AnyObject` 在哪里?
- python - 每次运行 COPY 命令时我应该创建表吗
- flutter - 在 Flutter 中将数据传递给有状态的小部件
- html5-video - 整个视频的 Videojs 持续时间显示为 0
- r - 如何在 R 中操作这些文件名?