首页 > 解决方案 > 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 表达式。我明白为什么这不起作用,但我不知道如何解决这个问题。有人可以帮我解决这个问题吗?

标签: c++matrixexponentiation

解决方案


主要问题是它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 

推荐阅读