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

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

Войти
Регистрация
Восстановить пароль
 
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
#1

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

13.05.2014, 17:15. Просмотров 886. Ответов 4
Метки нет (Все метки)

Есть класс матрица, делаю метод "транспонирование", и вообщем проблема в том, что программа нормально работает для матриц 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;
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2014, 17:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Транспонирование матрицы для размера NxM (C++):

Для матрицы размером NxM вывести на экран все седловые точки. - C++
Для матрицы размером NxM вывести на экран все седловые точки. Элемент матрицы называется седловой точкой, если он является наименьшим в...

дана действительная матрица размера nxm - C++
помогите решить дана действительная матрица размера nxm, все элементы которой различны. В каждой строке выбирается элемент с наименьшим...

Двумерный динамический массив размера NxM - C++
Создайте двумерный динамический массив размера NxM.Выделите для него и освободите память.

Дана матрица размера NXM. Найти суммы элементов всех её чётных, нечётных строк, столбцов - C++
// Матрицы.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include&lt;conio.h&gt; #include&lt;iostream&gt; ...

Для заданной матрицы размера NхN найти такие k и n, что сумма элементов k- столбца матрицы совпадает с суммой элементов n- го строки - C++
Для заданной матрицы размера NхN найти такие k и n, что сумма элементов k- столбца матрицы совпадает с суммой элементов n- го строки. Найти...

Для действительной матрицы размера m x n определить числа b0, b1,…, bm - C++
Для действительной матрицы размера m x n определить числа b0, b1,…, bm равные соответственно: суммам элементов строк. Матрица размещается...

4
Тамика
Котовчанин
909 / 454 / 144
Регистрация: 16.02.2010
Сообщений: 3,082
Записей в блоге: 27
13.05.2014, 17:17 #2
программа нормально работает для матриц NxN, а вот для NxN нет
Э... Ну даже затрудняюсь что либо ответить...

Добавлено через 1 минуту
Попробуйте не функцию transpose(), а функцию transpose()!
А вообще - можно больше кода?..
0
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
13.05.2014, 17:18  [ТС] #3
Цитата Сообщение от Тамика Посмотреть сообщение
программа нормально работает для матриц NxN, а вот для NxN нет
Э... Ну даже затрудняюсь что либо ответить...
Опечатка)работает для NxN, для NxM нет...
0
Тамика
Котовчанин
909 / 454 / 144
Регистрация: 16.02.2010
Сообщений: 3,082
Записей в блоге: 27
13.05.2014, 17:19 #4
Цитата Сообщение от IgorSer Посмотреть сообщение
Matrix t(Cols, Rows); // это конструктор, он создает новую матрицу, как в нее вернуть правильную матрицу размером NxM
Передать как параметр, если я Вас правильно поняла...
0
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
13.05.2014, 17:23  [ТС] #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();
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 17:23
Привет! Вот еще темы с ответами:

Преобразование матрицы nxm - C++
Народ очень нужна ваша помощь! Сделать вот такое вот задание буду признателен) Преобразование матрицы размерностью nxm разделить все...

транспонирование матрицы - C++
Из квадратной матрицы X построить матрицу Y, заменив строки столбцами (транспонирование матрицы). Исходную и полученную матрицу вывести на...

Транспонирование матрицы - C++
Здравствуйте! Пишу функцию для транспонирования матрицы... Вот код: void tran(){ int n,m; cout &lt;&lt; &quot;Введите кол-во строк: &quot;; ...

Транспонирование матрицы - C++
Всем привет! Написала класс матрица. Но почему-то не работает функция транспонирования и перегрузка оператора *=. Помогите, пожалуйста,...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
13.05.2014, 17:23
Ответ Создать тему
Опции темы

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