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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
proech
10 / 10 / 2
Регистрация: 10.07.2013
Сообщений: 150
#1

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

12.10.2013, 22:24. Просмотров 411. Ответов 4
Метки нет (Все метки)

неправильно возводит в степень матрицу
не знаю может алгоритм неверный)
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     неправильно возводит в степень матрицу с++
Посмотрите здесь:

Для нечетных чисел начиная с 9743 неправильно возводит в степень - C++
// Для нечетных чисел начиная с 9743 неправильно возводит в степень // ответ на 1 меньше почему? #include&lt;iostream&gt; using...

Программа не правильно возводит в степень - C++
Есть задача, перевернуть число. Программа работает, но вместо последней цифры выдаёт 2 совершенно других числа, например: 654 выдаёт 4559 ...

Написать программу, которая возводит число в соответствующую степень - C++
Написать программу, которая возводит число в соответствующую степень(без использования стандартных функций). Число и степень вводит...

Написать программу, которая возводит число в соответствующую степень(без использования стандартных функций) - C++
Кто знает как решить задачу на С++. Нужно через цикл while её решить. Написать программу, которая возводит число в соответствующую...

Напишите рекурсивную функцию, которая возводит число в степень путем многократного умножения числа на самое себя - C++
Доброе время суток! Напишите рекурсивную функцию, которая возводит число в степень путем многократного умножения числа на самое себя,...

Возвести матрицу в степень? - C++
Как возвести в n степень, данную матрицу? void Step() { int p, g, n, i, j, k, s; int c; setlocale(0, &quot;&quot;); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гром
210 / 129 / 11
Регистрация: 20.03.2009
Сообщений: 1,103
Записей в блоге: 16
Завершенные тесты: 1
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];
в цикле
Гром
210 / 129 / 11
Регистрация: 20.03.2009
Сообщений: 1,103
Записей в блоге: 16
Завершенные тесты: 1
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] без создания временной переменной
  }
У вас ведь только при возведении в квадрат будут одинаковые сомножители, потом будут разные.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2013, 21:34     неправильно возводит в степень матрицу с++
Еще ссылки по теме:

Возвести матрицу в степень - C++
Дана квадратная матрица А. Возвести ее в степень К помогите пожалуйста...

Возвести матрицу в целочисленную степень - C++
Каким образом можно возвести двумерный массив (т. е. матрицу) в целочисленную степень?Например for(int i=0;i&lt;4;i++) D=D^i;

Как считать матрицу 3*3 из файла если он там задан неправильно - C++
как считать матрицу 3*3 из файла если он там задан неправильно например в файле 4 5 6 7 8 1 2 3 4 9 8 7 а должно считать 4 5...

В квадрат возводит,а в куб нет - C++
# include &lt;stdio.h&gt; int k,T; int a; int main() { scanf(&quot;%d&quot;,&amp;T); while(T--){

Написать функцию, которая возводит число в квадрат и извлекает корень из него - C++
Простейшая программа, которая возводит число в квадрат и извлекает корень из него. Число конкретно здесь задано, 16. А НУЖНО, чтобы число...

Создать функцию которая возводит число в квадрат, использовать принцип раздельной компиляции - C++
Создать функцию которая возводит число в квадрат. Использовать принцип раздельной компиляции. Заранее спасибо!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
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     неправильно возводит в степень матрицу с++
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru