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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
MadSmile
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 3
#1

Реализовать умножение матрицы на матрицу и матрицы на вектор - C++

30.05.2013, 20:59. Просмотров 1678. Ответов 4
Метки нет (Все метки)

Доброй ночи форумчане,не знаю куда податься уже, я полный ноль в программировании, но дали задание написать на С++ прогу, Задание такое, Реализовать умножение матрицы на матрицу и матрицы на вектор.Необходимо использовать структуру для хранения только ненулевых значений матрицы. Сердечно прошу помочь буду очень благодарен если будет код с коментариями,хоть чтоб посидеть и повтыкать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2013, 20:59     Реализовать умножение матрицы на матрицу и матрицы на вектор
Посмотрите здесь:

Умножение матрицы на вектор C++
C++ Умножение матрицы на вектор
Умножение матрицы на вектор C++
Умножение матрицы на матрицу, и нахождение обратной матрицы C++
Умножение матрицы на вектор-столбец C++
Умножение матрицы на вектор C++
C++ Умножение матрицы на вектор с использованием функций
Умножение матрицы на вектор C++
Неправильно производится умножение матрицы на вектор C++
C++ Умножение матрицы на вектор-столбец - C++
C++ Умножение матрицы на вектор
C++ Умножение матрицы на вектор. ошибка в вычислении

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MadSmile
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 3
31.05.2013, 21:42  [ТС]     Реализовать умножение матрицы на матрицу и матрицы на вектор #2
Помогиииите!!!!
MarVaL
С++ Beginner
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
31.05.2013, 22:43     Реализовать умножение матрицы на матрицу и матрицы на вектор #3
Умножение матрицы на вектор:
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
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
 
int main() {
  srand(time(0));                                         // Ustanavlivaem "zerno" dlya sluchainih chisel
  int **matrix, *vector, *res_vector, n, m;    
    std::cout << "n = ";
  std::cin >> n;                                          // n strok
  std::cout << "m = ";
  std::cin >> m;                                          // mm stolbcov
  matrix = new int*[n];                                   // Videlyaem pamyat pod stroki
  for(int i = 0; i < n; ++i)
    matrix[i] = new int[m];                               // Videlyam pamyat pod stolbci v kajdoi stroke
  
  vector = new int[m];                                    // Videlyem pamyat pod vector na kotorij budem umnojat
  
  std::cout << "Vector:" << std::endl;
  for(int i = 0; i < m; ++i) {
    vector[i] = 1 + rand() % 9;                            // zapolnyaem sluchainimi chislami vector i vivodim ego
    std::cout << std::setw(3) << vector[i];
  }   
  
  res_vector = new int[n];                                // Videlyaem pamyat pod vector kuda zapisivaem resultat umnojeniya
  
  std::cout << "\nMatrix:" << std::endl;
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j) {
      matrix[i][j] = 1 + rand() % 9;                      // Zapolnili matricu
      std::cout << std::setw(3) << matrix[i][j];          // vivodim tut je
    }
    std::cout << std::endl;
  }
  std::cout << std::endl;
  
  for(int i = 0; i < n; ++i)                            // zapolnnyaem nulyami resultiruiwij vector t.k. ispolsuem summirovanie nije
    res_vector[i] = 0;
  std::cout << "Result: " << std::endl;
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
      res_vector[i] += matrix[i][j] * vector[j];          // Umnojaem
    std::cout << res_vector[i] << ' ';                    // kak poluchili element vivodim ego
  }
  
  
  delete[] res_vector;                                    // Osvobojdaem is pod vsego pamyat
  delete[] vector;
  for(int i = 0; i < n; ++i)
    delete[] matrix[i];
  delete[] matrix;
}
Добавлено через 35 минут
Матрица на матрицу:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
 
int** createMatrix(int, int);
void showMatrix(int **, int, int);
void fillMatrix(int **, int, int);
void deleteMatrix(int **, int);
 
int main() {
  srand(time(0));
  int **A, **B, **C, n, m, p;
  std::cout << "Please enter size of matrix A(n x m)" << std::endl;
  std::cout << "n = ";
  std::cin >> n;
  std::cout << "m = ";
  std::cin >> m;
  std::cout << "p = ";
  std::cin >> p;
  A = createMatrix(n, m);
  B = createMatrix(m, p);
  C = createMatrix(n, p);
  fillMatrix(A, n, m);
  fillMatrix(B, m, p);
  
  std::cout << "A:" << std::endl;
  showMatrix(A, n, m);
  std::cout << "\nB:" << std::endl;
  showMatrix(B, m, p);
  
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < p; ++j) {
      C[i][j] = 0;
      for(int k = 0; k < m; ++k)
        C[i][j] += A[i][k] * B[k][j];
    }
  }
  std::cout << "\nC:" << std::endl;
  showMatrix(C, n, p);
  deleteMatrix(A, n);
  deleteMatrix(B, m);
  deleteMatrix(C, n);
  return 0;
}
 
 
int** createMatrix(int n, int m) {
  int **matr = new int*[n];
  for(int i = 0; i < n; ++i)
    matr[i] = new int[m];
  return matr;
}
 
void fillMatrix(int **matr, int n, int m) {
  for(int i = 0; i < n; ++i)
    for(int j = 0; j < m; ++j)
      matr[i][j] = 1 + rand() % 99;
}
 
void showMatrix(int **matr, int n, int m) {
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
     std::cout << std::setw(8) << matr[i][j];
    std::cout << std::endl;
  }
}
 
void deleteMatrix(int **matr, int n) {
  for(int i = 0; i < n; ++i)
    delete[] matr[i];
  delete[] matr;
}
Belfegor
Ghost
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
31.05.2013, 22:52     Реализовать умножение матрицы на матрицу и матрицы на вектор #4
матрица на матрицу:
C++
1
2
3
4
5
6
7
8
9
10
void mult(int **x, int **y, int **mt, int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            mt[i][j] = 0;
            for (int k = 0; k < n; k++) {
                mt[i][j] += x[i][k] * y[k][j];
            }
        }
    }
}
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
31.05.2013, 23:46     Реализовать умножение матрицы на матрицу и матрицы на вектор #5
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
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <functional>
#include <random>
#include <chrono>
 
template<typename T>
class matrix
{
  private:
      T** m_matrix;
      std::size_t m_rows, m_cols;
      std::size_t m_size;
  public:
    typedef T*          iterator;
    typedef const T*    const_iterator;
    iterator        begin()         {return m_matrix[0];}
    iterator        end()           {return m_matrix[0]+m_size;}
    
    explicit matrix(const std::size_t rows = 1, const std::size_t cols = 1): m_rows(rows), m_cols(cols), m_size(m_cols*m_rows)
    {
      if (m_size == 0)
        m_matrix = nullptr;
      m_matrix = new T*[m_rows];
      m_matrix[0] = new T[m_size];
      for (size_t i = 1; i<m_rows; ++i)
          m_matrix[i] = m_matrix[i-1]+m_cols;
    }
    
    ~matrix()
    {
      if (m_matrix)
      {
          delete[] m_matrix[0];
          delete[] m_matrix;
      }
      else
          delete[] m_matrix;
    }
    
    const T* operator[](std::size_t index) const {return m_matrix[index];}
    T* operator[](std::size_t index) {return m_matrix[index];}
    
    void print(const int format = 0) const
    {
      for (std::size_t i = 0; i<m_rows; ++i)
        {
          for (std::size_t j = 0; j<m_cols; ++j)
            std::cout<<std::setw(format)<<m_matrix[i][j]<<" ";
          std::cout<<"\n";
        } 
    }
};
 
int main()
{
    std::default_random_engine gen(std::chrono::system_clock::now().time_since_epoch().count());
    std::uniform_int_distribution<> distribution(-50, 50);
    
    const size_t rows = 20, cols = 10;
    matrix<int> a(rows, cols);
    matrix<int> b(rows, cols);
    std::vector<int> v(rows*cols);
    
    for (int& i : a) i = distribution(gen);
    for (int& i : b) i = distribution(gen);
    for (int& i : v) i = distribution(gen);
    
    matrix<int> a_b(rows, cols);
    matrix<int> a_v(rows, cols);
    std::transform(a.begin(), a.end(), b.begin(), a_b.begin(), std::multiplies<int>());
    std::transform(a.begin(), a.end(), v.begin(), a_v.begin(), std::multiplies<int>());
    
    a_b.print(6);
    std::cout<<"\n\n";
    
    a_v.print(6);
    std::cout<<"\n\n";
            
    return 0;
}
Yandex
Объявления
31.05.2013, 23:46     Реализовать умножение матрицы на матрицу и матрицы на вектор
Ответ Создать тему
Опции темы

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