C++ Как Возвести Матрицу В Степень N ?

proef

New Member
13.10.2013
1
0
#1
так работает только первые три значения
вот код полностью
C++:
// ConsoleApplication68.cpp: определяет точку входа для консольного приложения.
//


#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <math.h>

class Matrix
{protected:
float **InitMatrix;
int ISizeOfMatrix;
int JSizeOfMatrix;
public:
/*ввод*/  friend std::istream &operator>>(std::istream &Stream,Matrix &a)  
{
for (int NumberI = 0;NumberI<a.ISizeOfMatrix;NumberI++){
for (int NumberJ = 0;NumberJ<a.JSizeOfMatrix;NumberJ++){
std::cout<<"["<<NumberI<<"]"<<"["<<NumberJ<<"] = ";
Stream>>a.InitMatrix[NumberI][NumberJ];
}


}
std::cout<<"______________________________"<<std::endl;
return Stream;

}
/*вывод*/ friend std::ostream &operator<<(std::ostream &Stream,Matrix &a)
{
for (int NumberI = 0;NumberI<a.ISizeOfMatrix;NumberI++)
{
for (int NumberJ = 0;NumberJ<a.JSizeOfMatrix;NumberJ++)
{
std::cout<<"["<<NumberI<<"]"<<"["<<NumberJ<<"] = ";
Stream<<a.InitMatrix[NumberI][NumberJ];
}
Stream<<std::endl;

}
Stream<<"______________________________"<<std::endl;
return Stream;
}
/*конструктор*/							 Matrix(int SizeI ,int SizeJ)
{	  
ISizeOfMatrix = SizeI;
JSizeOfMatrix = SizeJ;
InitMatrix = new float*[ISizeOfMatrix];
for (int Number = 0;Number<ISizeOfMatrix;Number++)
{
InitMatrix[Number] = new float[JSizeOfMatrix];
}
}
/*деструктор*/												 ~Matrix()
{ 
delete[] this->InitMatrix;
}
/*+*/								 Matrix& operator+(Matrix &Element)
{ 
std::cout<<"сложение"<<std::endl;

if((this->ISizeOfMatrix != Element.ISizeOfMatrix) ||(this->JSizeOfMatrix != Element.JSizeOfMatrix)){
std::cout << "Different sizes" << std::endl;
return *this;}else {

for (int NumberI = 0;NumberI<this->ISizeOfMatrix; NumberI++){
for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++){
this->InitMatrix[NumberI][NumberJ] += Element.InitMatrix[NumberI][NumberJ];
}
}
return *this;
}

}
/*возведение в степень*/					  Matrix & operator()(int Degree)
{ std::cout<<"возведение в степень"<<std::endl;
if (this->ISizeOfMatrix !=this->JSizeOfMatrix){ std::cout<<"матрица не квадратная"<<std::endl;return *this;}
else
{ int I,J,K; float e = 0.0;
//for (int CurrDegr = 0;CurrDegr<Degree;CurrDegr++){
for ( I = 0;I<ISizeOfMatrix;I++)
{e = 0.0;
for ( J = 0;J<ISizeOfMatrix;J++){
e = 0.0;
for ( K= 0;K<ISizeOfMatrix;K++)
e += InitMatrix[J][K]*InitMatrix[K][J];





InitMatrix[I][J] = e;
}



}
return *this;
}
}
/*приравнивание*/					  Matrix& operator=(Matrix &Element)
{
for (int NumberI = 0;NumberI<this->ISizeOfMatrix;NumberI++){
for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++)
{InitMatrix[NumberI][NumberJ] = Element.InitMatrix[NumberI][NumberJ];}}
return *this;}
/*обращение по индексу*/			float &operator()(int SizeI,int SizeJ){ return this->InitMatrix[SizeI][SizeJ];} 
};

int main(int argCount , char** arguments)
{
setlocale(2,"rus");
Matrix a(3,3);
std::cout<<"матрица A"<<std::endl;
std::cin>>a;
std::cout<<a;
Matrix b(3,3);
std::cout<<"Матрица В"<<std::endl;
std::cin>>b;
std::cout<<"a(1,0)+b(1,0) ="; 
float q = a(1,0)+b(1,0); std::cout<<q<<std::endl;
a(2);
std::cout<<a;
std::cout<<a+b;

system("pause");
return 0;
}