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

Транспонирование матрицы для размера NxM - C++

Восстановить пароль Регистрация
 
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
13.05.2014, 17:15     Транспонирование матрицы для размера NxM #1
Есть класс матрица, делаю метод "транспонирование", и вообщем проблема в том, что программа нормально работает для матриц NxN, а вот для NxM нет. Помогите решить проблему.
Метод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Matrix Matrix::transpose()
{
  Matrix t(Cols, Rows); // это конструктор, он создает новую матрицу, как в нее вернуть правильную матрицу размером NxM
  for(int i = 0; i < Rows; i++)
    for(int j = 0; j < Cols; j++)
    {
      float tmp = buffer[i][j];
      buffer[i][j] = buffer[j][i];
      buffer[j][i] = tmp;
    }
  return t;
};
Вывод:
C++
1
2
3
4
5
6
7
8
void Matrix::PrintTrans()
{
  for(int i = 0; i < Cols; i++) {
    for(int j = 0; j < Rows; j++)
      cout << "\t" << setw(4) << buffer[i][j];
    cout << endl;
  }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2014, 17:15     Транспонирование матрицы для размера NxM
Посмотрите здесь:

Транспонирование матрицы C++
Для действительной матрицы размера m x n определить числа b0, b1,…, bm C++
C++ Для заданной матрицы размера NхN найти такие k и n, что сумма элементов k- столбца матрицы совпадает с суммой элементов n- го строки
C++ дана действительная матрица размера nxm
C++ Для матрицы размером NxM вывести на экран все седловые точки.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,538
Записей в блоге: 27
13.05.2014, 17:17     Транспонирование матрицы для размера NxM #2
программа нормально работает для матриц NxN, а вот для NxN нет
Э... Ну даже затрудняюсь что либо ответить...

Добавлено через 1 минуту
Попробуйте не функцию transpose(), а функцию transpose()!
А вообще - можно больше кода?..
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
13.05.2014, 17:18  [ТС]     Транспонирование матрицы для размера NxM #3
Цитата Сообщение от Тамика Посмотреть сообщение
программа нормально работает для матриц NxN, а вот для NxN нет
Э... Ну даже затрудняюсь что либо ответить...
Опечатка)работает для NxN, для NxM нет...
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,538
Записей в блоге: 27
13.05.2014, 17:19     Транспонирование матрицы для размера NxM #4
Цитата Сообщение от IgorSer Посмотреть сообщение
Matrix t(Cols, Rows); // это конструктор, он создает новую матрицу, как в нее вернуть правильную матрицу размером NxM
Передать как параметр, если я Вас правильно поняла...
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
13.05.2014, 17:23  [ТС]     Транспонирование матрицы для размера NxM #5
Тамика, матрица создается через другой метод, в main.cpp
C++
1
2
3
4
cout << "\n Транспонирование: " << endl;
  trn.Create();
  trn.transpose();
  trn.PrintTrans();
Добавлено через 1 минуту
Вот весь код:
Matrix.h
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
#include "stdio.h"
 
class Matrix
{
private:
  int Rows; // строки матрицы
  int Cols; // столбцы матрицы
  float **buffer; // матрица
public:
  Matrix(int Row = 1, int Col = 1);
  ~Matrix(void);
  
  void Create();
  void Print();
  void PrintMul();
  void PrintTrans();
  
  Matrix operator+ (const Matrix &matrix);
  Matrix operator- (const Matrix &matrix);
  Matrix operator* (const Matrix &matrix);
  Matrix transpose();
  float determinant();
  float reverse();
};
matrix.cpp
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#include "Matrix.h"
#include "cmath"
#include "stdlib.h"
#include "iostream"
#include "iomanip"
 
using namespace std;
 
Matrix::Matrix(int Row, int Col)
{
  Rows = Row;
  Cols = Col;
 
  buffer = new float*[Rows];
  for(int i = 0; i < Rows; i++) {
    buffer[i] = new float[Cols];
    for(int j = 0; j < Cols; j++)
      buffer[i][j] = 0;
  }
};
 
Matrix::~Matrix()
{
 //for(int i = 0; i < Rows; i++)
 //  delete [] buffer[i];
 // delete [] buffer;
};
 
void Matrix::Create()
{
  float q = 1;
  cout << endl << "[->]: Введите матрицу размером: " << Rows << " на " << Cols << endl;
  for(int i = 0; i < Rows; i++)
    for(int j = 0; j < Cols; j++) {
      //cout << "[" << i+1 << "]" << "[" << j+1 <<"]: ";
      //cin >> buffer[i][j];
      buffer[i][j] = q;
      q++;
    }
}
 
void Matrix::Print()
{
  for(int i = 0; i < Rows; i++) {
    for(int j = 0; j < Cols; j++)
      cout << "\t" << setw(4) << buffer[i][j];
    cout << endl;
  }
}
 
void Matrix::PrintMul()
{
  for(int i = 0; i < Rows; i++) {
    for(int j = 0; j < Rows; j++)
      cout << "\t" << setw(4) << buffer[i][j];
    cout << endl;
  }
}
 
void Matrix::PrintTrans()
{
  for(int i = 0; i < Cols; i++) {
    for(int j = 0; j < Rows; j++)
      cout << "\t" << setw(4) << buffer[i][j];
    cout << endl;
  }
}
 
Matrix Matrix::operator+ (const Matrix &matrix)
{
  Matrix t(Rows, Cols);
  if(Rows != matrix.Rows || Cols != matrix.Cols)
    return 0;
  for(int i = 0; i < Rows; i++)
    for(int j = 0; j < Cols; j++)
      t.buffer[i][j] = buffer[i][j] + matrix.buffer[i][j];
  return t;
};
 
Matrix Matrix::operator- (const Matrix &matrix)
{
  Matrix t(Rows, Cols);
  if(Rows != matrix.Rows || Cols != matrix.Cols)
    return 0;
  for(int i = 0; i < Rows; i++)
    for(int j = 0; j < Cols; j++)
      t.buffer[i][j] = buffer[i][j] - matrix.buffer[i][j];
  return t;
};
 
Matrix Matrix::operator* (const Matrix &matrix)
{
  if(Rows == matrix.Cols) {
    Matrix t(Rows, matrix.Cols);
    for (int row = 0; row < Rows; row++)
      for (int col = 0; col < matrix.Cols; col++)
        for (int inner = 0; inner < matrix.Rows; inner++)
          t.buffer[row][col] += buffer[row][inner] * matrix.buffer[inner][col];
    return t;
  } else
    return 0;
};
 
Matrix Matrix::transpose()
{
  Matrix t(Cols, Rows);
  for(int i = 0; i < Rows; i++)
    for(int j = 0; j < Cols; j++)
    {
      float tmp = buffer[i][j];
      buffer[i][j] = buffer[j][i];
      buffer[j][i] = tmp;
    }
  return t;
};
 
float Matrix::determinant()
{
  if(Rows != Cols)
    return 0;
  float det = 1;
  for(int i = 0; i < Rows; i++)
  {
    for(int j = i+1; j < Cols; j++)
    {
      if(buffer[i][i] == 0)
        return 0;
      float b = buffer[j][i] / buffer[i][i];
      for(int k = i; k < Rows; k++)
        buffer[j][k] = buffer[j][k] - buffer[i][k] * b;
    }
    det *= buffer[i][i]; //вычисление определителя
  }
  if(det == 0)
    det = fabs(det);
  return det;
};
 
float Matrix::reverse()
{
  if(Rows != Cols)
    return 0;
 
  float **x; // единичная матрица
  int i,j,k;
  //создание единичной матрицы
  x = new float* [Rows];
  for(i = 0; i < Rows; i++)
  {
    x[i] = new float [Rows];
    for(j = 0; j < Rows; j++)
      x[i][j] = 0;
    x[i][i] = 1;
  }
  //прямой ход методом Гаусса
  float a,b;
  for(i = 0; i < Rows; i++)
  {
    a = buffer[i][i];
    for(j = i+1; j < Rows; j++)
    {
      b = buffer[j][i];
      for(k = 0; k < Rows; k++)
      {
        buffer[j][k] = buffer[i][k] * b - buffer[j][k] * a;
        x[j][k] = x[i][k] * b - x[j][k] * a;
      }
    }
  }
  //обратный ход вычисления элементов обратной матрицы
  float sum;
  for(i = 0; i < Rows; i++)
  {
    for(j = Rows-1; j >= 0; j--)
    {
      sum = 0;
      for(k = Rows-1; k > j; k--)
        sum += buffer[j][k] * x[k][i];
      if(buffer[j][j] == 0)
      {
        for(i = 0; i < Rows; i++)
          delete []x[i];
        delete []x;
        return 0;
      }
      x[j][i] = (x[j][i] - sum) / buffer[j][j];
    }
  }
  for(int i = 0; i < Rows; i++)
    for(int j = 0; j < Rows; j++)
      buffer[i][j] = x[i][j];
  return **buffer;
};
main.cpp
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
#include "iostream"
#include "Matrix.h"
using namespace std;
int main(int argc, const char * argv[])
{
  int n1,m1, n2,m2;
  cout << "[->]: Введите размер первой метрицы: ";
  cin >> n1 >> m1;
  cout << "[->]: Введите размер второй метрицы: ";
  cin >> n2 >> m2;
  Matrix a(n1,m1), b(n2,m2), c(m1,n2), det(n1,m1),trn(n1,m1), rev(n1,m1);
  
  a.Create();
  b.Create();
  
  cout << endl;
  cout << "Матрица 1: " << endl;
  a.Print();
  cout << "Матрица 2: " << endl;
  b.Print();
  
  cout << "*****" << endl;
  
  cout << "\n Сумма матриц: " << endl;
  c = a + b;
  c.Print();
  
  cout << "\n Вычитание матриц: " << endl;
  c = a - b;
  c.Print();
  
  cout << "\n Умножение матриц: " << endl;
  c = a * b;
  c.PrintMul();
  
  cout << endl << "*****" << endl;
  
  cout << "\n Определитель матрицы: " << endl;
  det.Create();
  det.Print();
  cout << "\n[*]Определитель = ";
  cout << det.determinant();
  
  cout << endl << endl << "*****" << endl;
  
  cout << "\n Обратная матрица: " << endl;
  rev.Create();
  rev.Print();
  if(rev.determinant() != 0) {
    rev.reverse();
    cout << "[*]Ответ: " << endl;
    rev.Print();
  } else
    cout << endl << "[!] Определитель равен нулю. Обратная матрица не может быть найдена!";
  
  cout << endl << "*****" << endl;
  
  cout << "\n Транспонирование: " << endl;
  trn.Create();
  trn.Print();
  trn.transpose();
  cout << "[*]Ответ: " << endl;
  trn.PrintTrans();
}
Yandex
Объявления
13.05.2014, 17:23     Транспонирование матрицы для размера NxM
Ответ Создать тему
Опции темы

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