C ++中的简单矩阵求幂

Simple matrix exponentiation in 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 expression。我明白为什么这行不通,但我不知道如何解决这个问题。有人可以帮我解决这个问题吗?

主要问题是 multip 更改了它的第三个参数,因此它不能与第一个参数相同,就像在您的代码中调用 multip(M, expo(M, n), M); 一样。

如果您使用函数 return values 作为 returning 值,就像您应该的那样,它会变得简单。

修复和工作示例:

#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