Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2013, 17:09   #1
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию c++ как возвести матрицу в степень n ?

так не работает
Код:
int I,J,K;
         float e  = 0;
		
for ( I = 0;I<ISizeOfMatrix;++I){    e = 0;
for ( K = 0;K<ISizeOfMatrix;++K){
for ( J= 0;J<ISizeOfMatrix;++J)
{ e += this->InitMatrix[J][K]*InitMatrix[K][J];}
				
				this->InitMatrix[I][J] = e;}}
как нужно сделать?

Последний раз редактировалось proef; 13.10.2013 в 18:22.
proef вне форума Ответить с цитированием
Старый 13.10.2013, 18:11   #2
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

вот если что программа полностью
Код:
// 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)
	{
	if (this->ISizeOfMatrix !=this->JSizeOfMatrix){ std::cout<<"матрица не квадратная"<<std::endl;return *this;}
	else
	{    int I,J,K;
         float e  = 0;
		
		for ( I = 0;I<ISizeOfMatrix;++I){e = 0;for ( K = 0;K<ISizeOfMatrix;++K){
		for ( J= 0;J<ISizeOfMatrix;++J){ 
			e += this->InitMatrix[I][K]*InitMatrix[K][J];}
		this->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++)
			{
			this->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;
    std::cout<<a(2);
    std::cout<<a+b;
 
   system("pause");
	return 0;
}
proef вне форума Ответить с цитированием
Старый 13.10.2013, 19:47   #3
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

в интернете то толком и нету такого почти (я не нашёл )
может кто знает?

Последний раз редактировалось proef; 13.10.2013 в 21:42.
proef вне форума Ответить с цитированием
Старый 13.10.2013, 21:42   #4
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

теперь только первую строку правильно делает
Код:
 int I,J,K;
         float e  = 0.0 ;
		//for (int CurrDegr = 0;CurrDegr<Degree;CurrDegr++){
		for ( I = 0;I<ISizeOfMatrix;++I)
			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;
		
		
		
		
		}
proef вне форума Ответить с цитированием
Старый 13.10.2013, 22:32   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Сохраняйте результаты расчета во временную матрицу.
Код:
tmp = new float*[ISizeOfMatrix];
for (int Number = 0;Number<ISizeOfMatrix;Number++)
    tmp[Number] = new float[JSizeOfMatrix];
for (I = 0;I<ISizeOfMatrix;++I)
    for (J = 0;J<JSizeOfMatrix;++J) {
        tmp[I][J] = 0;
        for ( K= 0;K<ISizeOfMatrix;++K)
            tmp[I][J] += InitMatrix[I][K]*InitMatrix[K][J];
    }
for (I = 0;I<ISizeOfMatrix;++I)
    delete[] InitMatrix[I];
delete[] InitMatrix;
InitMatrix = tmp;
Кстати, у Вас неправильный деструктор. Количество delete должно совпадать с количество new.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 13.10.2013 в 22:36.
BDA на форуме Ответить с цитированием
Старый 13.10.2013, 22:52   #6
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

Спасибо
сначала тоже делал так но почему - то выдавало
"
Необработанное исключение по адресу 0x00C3889C в ConsoleApplication68.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00008127."
решил переделать так

Последний раз редактировалось proef; 13.10.2013 в 23:03.
proef вне форума Ответить с цитированием
Старый 13.10.2013, 23:04   #7
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

cейчас в любом случае в квадрат возводит
Код:
	float** tmp = new float*[ISizeOfMatrix];
	int I,J,K;

	for (int Number = 0;Number<ISizeOfMatrix;++Number)
	{tmp[Number] = new float[ISizeOfMatrix];}

	for (int CurrDeg = 0;CurrDeg<Degree;CurrDeg++){
	for (int I = 0;I<ISizeOfMatrix;++I)
	{
	for (int J = 0;J<ISizeOfMatrix;++J)
	{
	tmp[I][J] = 0;
	for (K = 0;K<ISizeOfMatrix;++K)
	{
     tmp[I][J] += InitMatrix[I][K]*InitMatrix[K][J];
	}
	}
	}
	
	}
	InitMatrix = tmp;
proef вне форума Ответить с цитированием
Старый 13.10.2013, 23:23   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не тестировал:
Код:
float** tmp1 = new float*[ISizeOfMatrix];
float** tmp2 = new float*[ISizeOfMatrix];
float** tmp3 = NULL;
for (int I = 0;I<ISizeOfMatrix;++I) {
    tmp1[I] = new float[ISizeOfMatrix];
    tmp2[I] = new float[ISizeOfMatrix];
}
for (int I = 0;I<ISizeOfMatrix;++I)
    for (int J = 0;J<ISizeOfMatrix;++J)
        tmp2[I][J] = InitMatrix[I][J];
for (int CurrDeg = 1;CurrDeg<Degree;CurrDeg++) {
    tmp3 = tmp2;
    tmp2 = tmp1;
    tmp1 = tmp3;
    for (int I = 0;I<ISizeOfMatrix;++I)
        for (int J = 0;J<ISizeOfMatrix;++J) {
            tmp2[I][J] = 0;
            for (K = 0;K<ISizeOfMatrix;++K)
                tmp2[I][J] += tmp1[I][K]*InitMatrix[K][J];
            }
}
for (int I = 0;I<ISizeOfMatrix;++I) {
    delete[] tmp1[I];
    delete[] InitMatrix[I];
}
delete[] tmp1;
delete[] InitMatrix;
InitMatrix = tmp2;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 13.10.2013, 23:31   #9
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

работает

Спасибо
сначала не понял что написано но потом разобрался)
proef вне форума Ответить с цитированием
Старый 13.10.2013, 23:39   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Пожалуйста. Если будет у Вас время, можете реализовать так называемое быстрое возведение в степень.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как возвести число в степень 2^3 yura_zb Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 19.10.2012 08:49
Как возвести число в степень? Wintrymoon Паскаль, Turbo Pascal, PascalABC.NET 36 09.05.2011 15:11
возвести матрицу в степень !!! drylozav Помощь студентам 10 03.10.2010 19:38
как возвести в степень??? Yokka Свободное общение 4 24.03.2010 12:52
как ВОЗВЕСТИ В СТЕПЕНЬ? Sova123456 Помощь студентам 2 14.05.2008 20:19