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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Программа с использованием цикла http://www.cyberforum.ru/cpp-beginners/thread1174650.html
Даны положительные числа A и B (A> B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.
C++ Сформировать двоичный файл из элементов, заданных в варианте структур Сформировать двоичный файл из элементов, заданных в варианте структуры. Структура "Студент": - Фамилия, имя, отчество; - Дата рождения; - Домашний адрес; - рейтинг. Удалить элементы, у которых даты рождения совпадают, добавить элемент перед элементом с заданной фамилией. Спасибо!!!! http://www.cyberforum.ru/cpp-beginners/thread1174649.html
C++ В двумерном массиве найти последний четный элемент
Дан массив размером n×n, элементы которого целые числа. Для каждой строки найти последний четный элемент и записать данные в новый массив.
Поясните принцип работы паттерна "абстрактная фабрика" C++
это паттерн "абстрактная фабрика " .Просьба пояснить каждую строчку #include <iostream> class ICar // AbstractProductA { public: virtual void printName() = 0; virtual ~ICar() {} };
C++ Написать программу, которая выводит таблицу значений функции http://www.cyberforum.ru/cpp-beginners/thread1174603.html
Написать программу, которая выводит таблицу значений функции y=|x|−arcctg^2(x) в диапазоне с шагом 0,5.
C++ Не выходит найти ошибку Вообщем требуется методом Ньютона найти корень уравнения и я не знаю, где у меня ошибка (так как я новичок, не факт, что она одна), вот код: #include "stdafx.h" #include "math.h" #include "iostream" using namespace std; int f (int n) { if (n<=1) return 1; подробнее

Показать сообщение отдельно
IgorSer
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 103
13.05.2014, 17:23  [ТС]     Транспонирование матрицы для размера NxM
Тамика, матрица создается через другой метод, в 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();
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru