Форум программистов, компьютерный форум CyberForum.ru

неправильно возводит в степень матрицу с++ - C++

Восстановить пароль Регистрация
 
proech
10 / 10 / 2
Регистрация: 10.07.2013
Сообщений: 150
12.10.2013, 22:24     неправильно возводит в степень матрицу с++ #1
неправильно возводит в степень матрицу
не знаю может алгоритм неверный)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "stdafx.h"
#include <iostream>
#include <locale.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)
    { 
        Matrix Result(this->ISizeOfMatrix,this->JSizeOfMatrix);
         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++){
                Result.InitMatrix[NumberI][NumberJ] = this->InitMatrix[NumberI][NumberJ]+ Element.InitMatrix[NumberI][NumberJ];
             }
         }
         return Result;}
     
     }
    Matrix & operator()(int Degree)
    {float D;
    
        for (int NumberK = 0;NumberK<Degree-1;NumberK++)
        {
            for (int NumberI = 0;NumberI<this->ISizeOfMatrix;NumberI++)
            {D = 0;
            for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++)
            {
               D += this->InitMatrix[NumberI][NumberJ] * this->InitMatrix[NumberJ][NumberI];
            this->InitMatrix[NumberI][NumberJ] = D;
}} }
        
        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,2);
    std::cout<<"матрица A"<<std::endl;
    std::cin>>a;
    std::cout<<a;
    Matrix b(2,3);
    std::cout<<"Матрица В"<<std::endl;
    std::cin>>b;
 std::cout<<a(1,0)<<std::endl;
 std::cout<<"a(1,0)+b(1,0) ="; 
 float q = a(1,0)+b(1,0);
 std::cout<<q<<std::endl;
 std::cout<<a+b;
 
 std::cout<<a(2);
 
   system("pause");
    return 0;
}
Добавлено через 6 минут
Цитата Сообщение от proech Посмотреть сообщение
неправильно возводит в степень матрицу
не знаю может алгоритм неверный)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "stdafx.h"
#include <iostream>
#include <locale.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)
    { 
        Matrix Result(this->ISizeOfMatrix,this->JSizeOfMatrix);
         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++){
                Result.InitMatrix[NumberI][NumberJ] = this->InitMatrix[NumberI][NumberJ]+ Element.InitMatrix[NumberI][NumberJ];
             }
         }
         return Result;}
     
     }
//
//возведение в степень
//
    Matrix & operator()(int Degree)
    {float D;
    
        for (int NumberK = 0;NumberK<Degree-1;NumberK++)
        {
            for (int NumberI = 0;NumberI<this->ISizeOfMatrix;NumberI++)
            {D = 0;
            for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++)
            {
               D += this->InitMatrix[NumberI][NumberJ] * this->InitMatrix[NumberJ][NumberI];
            this->InitMatrix[NumberI][NumberJ] = D;
}} }
        
        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,2);
    std::cout<<"матрица A"<<std::endl;
    std::cin>>a;
    std::cout<<a;
    Matrix b(2,3);
    std::cout<<"Матрица В"<<std::endl;
    std::cin>>b;
 std::cout<<a(1,0)<<std::endl;
 std::cout<<"a(1,0)+b(1,0) ="; 
 float q = a(1,0)+b(1,0);
 std::cout<<q<<std::endl;
 std::cout<<a+b;
 
 std::cout<<a(2);
 
   system("pause");
    return 0;
}
как вообще возводить в степень матрицу?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2013, 22:24     неправильно возводит в степень матрицу с++
Посмотрите здесь:

Проверьте задачку по циклам, неправильно работает. [думаю что неправильно] C++
Как считать матрицу 3*3 из файла если он там задан неправильно C++
Возвести матрицу в степень C++
C++ Написать функцию, которая возводит число в квадрат и извлекает корень из него
Для нечетных чисел начиная с 9743 неправильно возводит в степень C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
12.10.2013, 23:27     неправильно возводит в степень матрицу с++ #2
Так она вроде у вас вообще не возводит в степень. А так - перемножьте нужное количество раз матрицу саму на себя (только для квадратной, метод "строка на столбец").

Плюс пара замечаний из того, что заметил при беглом взгляде:
1. Используйте double вместо float
2. В деструкторе, во-первых, не обязательно использовать this (как и в любой другой функции-члене класса; this чаще используется когда нужно из функции-члена передать в какую-то функцию указатель на объект, которому она принадлежит), во-вторых, нужно удалить внутренние массивы тоже:
C++
1
2
3
4
5
6
Matrix::~Matrix()
{
for (uint i = 0; i < size; ++i)
 delete[] elems[i];
delete[] elems;
}
proech
10 / 10 / 2
Регистрация: 10.07.2013
Сообщений: 150
13.10.2013, 01:14  [ТС]     неправильно возводит в степень матрицу с++ #3
если я правильно понимаю нужно сделать D += a[i][j]*a[j][i];
в цикле
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
13.10.2013, 06:25     неправильно возводит в степень матрицу с++ #4
Точнее, так:
C++
1
2
3
4
5
6
7
8
for (uint i = 0; i < sz; ++i)
 for (uint j = 0; j < sz; ++j)
  {
  elem = 0;
  for (uint k = 0; k < sz; ++k)
   elem += a[i][k] * b[k][j];
  c[i][j] = elem;   //или сразу работать с c[i][j] без создания временной переменной
  }
У вас ведь только при возведении в квадрат будут одинаковые сомножители, потом будут разные.
proech
10 / 10 / 2
Регистрация: 10.07.2013
Сообщений: 150
13.10.2013, 21:34  [ТС]     неправильно возводит в степень матрицу с++ #5
снова не правильно выводит)
допустим
если матрица вся из единиц то при возведении в квадрат
она должна состоять вся из троек
но не состоит
есть способ что можно возводить
через exp(n*ln(a[i][j])) но я не знаю что такое n

Добавлено через 4 часа 58 минут
добился того что делает правильно первую строку
если матрица полностью состоит из единиц
но дальше что-то не получается)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// 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()
                                  { 
                                      for (int  i = 0;i<ISizeOfMatrix;i++){
                                      delete[] this->InitMatrix[i];
                                      }
                                  }
     /*+*/                                  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;
}
Yandex
Объявления
13.10.2013, 21:34     неправильно возводит в степень матрицу с++
Ответ Создать тему
Опции темы

Текущее время: 00:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru