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

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

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

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

13.05.2014, 17:15. Просмотров 873. Ответов 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;
  }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2014, 17:15     Транспонирование матрицы для размера NxM
Посмотрите здесь:

Для матрицы размером 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 равные соответственно: суммам элементов строк. Матрица размещается...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 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 нет...
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 27
13.05.2014, 17:19     Транспонирование матрицы для размера NxM #4
Цитата Сообщение от IgorSer Посмотреть сообщение
Matrix t(Cols, Rows); // это конструктор, он создает новую матрицу, как в нее вернуть правильную матрицу размером NxM
Передать как параметр, если я Вас правильно поняла...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 17:23     Транспонирование матрицы для размера NxM
Еще ссылки по теме:

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

Транспонирование матрицы - C++
Здравствуйте! Помогите пожалуйста! Создать целочисленную матрицу размерностью N=5 строк и M=3 столбцов. Транспонировать матрицу и...

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

Транспонирование матрицы - C++
Что-то я совсем запуталась,не могу понять как транспонировать матрицу:/ --Вызвать функцию transpose(), формирующую матрицу b,...

Транспонирование матрицы - C++
Проверьте свойство (A^T)^T = А, где A – исходная матрица (n х n), Т означает транспонирование. Используйте процедуру транспониро- вания...


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

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

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