Простое матричное возведение в степень в c ++ - PullRequest
1 голос
/ 24 марта 2020

Поэтому меня попросили определить матрицу как:

typedef vector<double> vec;
typedef vector<vec> matrix;

и на основании этого написать некоторые функции, такие как скалярное умножение, сложение и т. Д. c. Все, кроме возведения в степень, работает довольно хорошо, и я понятия не имею, что может вызвать проблемы в этой функции. Прежде всего я определил умножение как:

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;}
}

Это не работает, возвращая [Ошибка] Неправильное использование пустого выражения. Я понял, почему это не сработает, но я понятия не имею, как обойти это. Может ли кто-нибудь помочь мне с этой проблемой?

1 Ответ

1 голос
/ 24 марта 2020

Основная проблема в том, что 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 
...