Возведение матрицы в степнь

240
29 марта 2018, 09:11

Пытаюсь сделать возведение матрицы в степень. Знаю, как выглядит умножение матриц (возведение в квадрат):

#include <iostream>
#include<math.h>
using namespace std;
int main() {
    double a[100][100], c[100][100];
    int i, j, l, n;
    double s(0);
    cout << "Matrix size:";
    cin >> n;
    cout << endl;
    for (i = 0; i<n; i++) {
        for (j = 0; j<n; j++) {
            c[i][j]=0;
        }
    }
    cout << "a matrix:" << endl;
    for (i = 0; i<n; i++) {
        for (j = 0; j<n; j++) {
            cin >> a[i][j];
        }
    }
    for (i = 0; i<n; i++) {
        for (l = 0; l<n; l++) {
            s = 0;
            for (j = 0; j<n; j++) {
                s += a[i][j] * a[j][l];
            }
            c[i][l] += s;
        }
    }
    cout << "rezult:" << endl;
    for (i = 0; i<n; i++) {
        for (j = 0; j<n; j++) {
            cout << c[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

Но как из этого сделать возведение в степень, не представляю. Подскажите. пожалуйста

Answer 1

Ну вот смотрите - для чисел это выглядит так:

long long power(long long i, unsigned int p)
{
    long long r = (p%2) ? i : 1;
    while(p/=2)
    {
        i = i*i;
        if (p%2) r *= i;
    }
    return r;
}

Если у вас есть матрица, и функция перемножения матриц типа

mul(a,b,c)

которая в c записывает произведение матриц a*b - то просто

void power(matrix i, unsigned int p, matrix&r)
{
    r = (p%2) ? i : I;  // I - единичная матрица
    while(p/=2)
    {
        mul(i,i,i);
        if (p%2) mul(i,r,r);
    }
}

Собственно, все. Надо только аккуратно написать функцию умножения матриц, чтоб она умела возводить в квадрат или умножать, и записывать на старое место - чтоб вызов типа mul(i,i,i) корректно отрабатывал.

Сами справитесь?

Update

Вот примерный вид такой функции для ваших матриц (раз уж вы их как матрицу 100x100 делаете, а не, скажем, классом):

typedef double matrix[100][100];
void mul(int n, matrix a, matrix b, matrix c)
{
    matrix d;
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < n; ++j)
        {
            double s = 0.0;
            for(int k = 0; k < n; ++k)
                s += a[i][k]*b[k][j];
            ((c == a || c == b) ? d[i][j] : c[i][j]) = s;
        }
    if (c == a || c == b)
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < n; ++j)
                c[i][j] = d[i][j];
}

Примерно так. Но не тестировал, написано просто чтоб показать идею; так что потестируйте сами.

Update2

По просьбам трудящихся :) - вот это

r = (p%2) ? i : I;  // I - единичная матрица

должно выглядеть примерно так в развернутом коде (n - размер матрицы):

if (p%2)
{
    for(int j = 0; j < n; ++j) for(int k = 0; k < n; ++k)
        r[j][k] = i[j][k];
}
else
{
    for(int j = 0; j < n; ++j) for(int k = 0; k < n; ++k)
        r[j][k] = (j==k) ? 1 : 0;
}

Ну, матрицу i лучше, конечно, переименовать - это имя было взято просто из кода для простого целого числа. Параметр n тоже можете передавать.

А вообще, матрицы - раз уж у нас C++ - лучше организовывать в виде классов...

Answer 2

Все уже сделано. У вас есть код который умножает одну матрицу на другую. Поместите этот код в функцию

void multiply( const double** a, const double** b, int size, double** result)
{
 //Реализация умножения
}
int main()
{
 double** a;
 double** result;
 //..инициализация
 multiply( a, a, size, result);//Возвели в квадрат
 multiply( result, a, size, result);//Возвели в 3 степень
 multiply( result, a, size, result);//Возвели в 4 степень
 return 0;
}
READ ALSO
Элементы AlertDialog располагаются сверху. (Android Studio)

Элементы AlertDialog располагаются сверху. (Android Studio)

Создаю AlertDialog следующим способом:

161
Калькулятор postfix JAVA

Калькулятор postfix JAVA

Сделал все по алгоритму Сначала перевод infix в postfix и запись операндов в стек метод convert() Далее метод который все это считает calculate() Не могу...

200
Событие на зажатие

Событие на зажатие

есть GridView, мне нужно если я зажму,выйдет вспылвающее окно, так вот

184
JSP Вывод json в цикле

JSP Вывод json в цикле

Мне приходит подобный JSON-массив:

199