Пытаюсь сделать возведение матрицы в степень. Знаю, как выглядит умножение матриц (возведение в квадрат):
#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;
}
Но как из этого сделать возведение в степень, не представляю. Подскажите. пожалуйста
Ну вот смотрите - для чисел это выглядит так:
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++ - лучше организовывать в виде классов...
Все уже сделано. У вас есть код который умножает одну матрицу на другую. Поместите этот код в функцию
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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Создаю AlertDialog следующим способом:
Сделал все по алгоритму Сначала перевод infix в postfix и запись операндов в стек метод convert() Далее метод который все это считает calculate() Не могу...