Skip to content

Conversation

@mmikhail2001
Copy link
Owner

@mmikhail2001 mmikhail2001 commented Oct 19, 2022

Pull Request с домашней работой #2 по C++, реализация матричного калькулятора. Хотелось бы внести ясность касательно следующих сущностей: DVector и DMatrix.

В моей реализации DVector - класс, максимально похожий на std::vector, поэтому нет разделения на вектор-столбец и вектор-строку, это просто обертка над динамическим массивом, последовательно размещенные в памяти элементы. Скалярное произведение вектора на вектор - это всегда вещественное число (не матрица), т.е. vector1.Dot(vector2) имеет возвращаемое значение double.

Умножение вектора на матрицу и матрицу на вектор выполняется следующим образом:

  • vector.Dot(matrix) - подразумевается, что умножается вектор-строка 1xN и матрица NxM, результат - вектор-строка, тип DVector
  • matrix.Dot(vector) - матрица MxN умножается на вектор-столбец Nx1, результат - вектор-столбец, тип DMatrix.

Если необходимо умножить вектор на вектор и получить матрицу, стоит использовать matrix.Dot(matrix). Чтобы преобразовать вектор в матрицу (DVector -> DMatrix), нужно воспользоваться конструктором, в котором можно указать, вектор-строка или вектор-столбец интересует.

UPD: Реализован и протестирован класс матрицы DMatrixCompile, являющийся "оберткой" над динамической матрицей DMatrix. Методы этой матрицы проверяют совместимость размеров при выполнении арифметических операций, валидность индекса при обращении к строке, столбцу на этапе компиляции. Если проверка прошла успешно, на этапе выполнения делегируют выполнение метода соответствующему методу динамической матрицы.

@Denactive Denactive self-assigned this Oct 19, 2022
Copy link
Collaborator

@Denactive Denactive left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Прекрасно сделал, мелкие исправления и апрув

@@ -0,0 +1,10 @@
#include <iostream>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

добавь сюда хоть какой-нибудь расчет


#include "dvector.h"

enum class ORIENT { ROW = 0, COL };
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут енам класс, ниже просто енам. почему?

throw std::runtime_error("Creation is impossible");
}
return DMatrix(rows, cols, fill_value);
} No newline at end of file
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

трушные прогеры оставляют пустую строку в конце файлов. погугли почему.
тут и везде добавь \n

@@ -0,0 +1,83 @@
#pragma once

#include "stdafx.h"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем тебе stdafx.h в этой программе?

~DVector();

public:
const double *CBegin() const;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не обязательно было реализовывать почти все методы от std::vector, но лайк

#include "dvector.h"

enum class ORIENT { ROW = 0, COL };
enum SLICE { ROW = 0, COL };
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я бы сделал явное указание, чему равен COL

enum SLICE {ROW = 0, COL}, чтобы
1. не писать класс, если в параметрах ROW / COL
2. кастилось к enum SLICE, если в параметрах 0 / 1
*/
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

во! это пояснение - наверх

jobs:
build:
runs-on: ubuntu-latest
container: leshiy1295/gcc_linters_valgrind_cmake_gtest
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

=)
уникальная возможность поставить все руками упущена

- name: launch valgrind
run: |
cd build
valgrind --tool=memcheck --leak-check=yes ./main No newline at end of file
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

проверял, падает ли CI если есть утечка? не уверен точно, надо ли --exit-code прописать
валгрин вызови на тестах. Main у тебя ничего не делает)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

сделал кавередж, молодец. Выведи в readme. можешь воспользоваться shields.io


env:
LIB_NAME: matrix_lib

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

часто выделяют prepare или beforescript с установкой всего необходимого, check - с линтером, build, test. требовать так делать не буду, особенно больно будет с линтером

DMatrix operator/(DMatrix left, DMatrix const &right);
DMatrix operator*(DMatrix left, DMatrix const &right);

void Print(DMatrix const &matrix, std::string const &msg = std::string{});
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

оставь эту функции, но добавь еще перегрузку оператора для << (std::cout<<new DMatrix() ) с его вызовом внутри

README.md Outdated

#### Домашняя работа 1

##### Мяделец Михаил WEB-11
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

подпиши ментора, преподавателя

@mmikhail2001
Copy link
Owner Author

mmikhail2001 commented Oct 22, 2022

Исправил замечания.

  • Добавил простой расчет в main.cpp
  • Оставил пустую строку в конце каждого файла
  • Убрал #include "stdafx.h", где он не нужен. stdafx.h - pre-compiled header для ускорения компиляции (в данном проекте он не является необходимостью, но в больших может существенно сэкономить время сборки)
  • operator[](size_t index) со спецификатором const и возвращающий const reference будет вызываться для const объектов для чтения значения по индексу, без спецификатора const - для изменения значения по индексу
  • Везде привел инкремент и декремент к префиксному виду
  • Добавил некоторые поясняющие комментарии к функциям, которые отвечают за умножения вектора на вектор, вектора на матрицу
  • В функциях для тестирования CompareVectors и CompareMatrices добавил выход по несоответствию размеров
  • В сценарии непрерывной интеграции добавил valgrind для тестирующего исполняемого файла
  • Добавил функции для перегрузки оператора << для DMatrix и DVector
  • Добавил ментора и преподавателя в README.md

Copy link
Collaborator

@Denactive Denactive left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Молодец, отличная работа. Аппрув.

\n не достает в конфигах таких как main.yml. Видно в интерфейсе этого ПР, если нажать Files changed

@Denactive
Copy link
Collaborator

Сдал вовремя, первым, за несколько дней до дедлайна. Быстро допилил задание с шаблонами. Исправил замечания. DVector реализует методы std::vector. Предварительно: 10б

{
if (begin >= end)
{
throw std::runtime_error("operator(): " + ERROR_RANGE);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

возможно, ошибки стоит стандартизировать. Например, вынести в .h дефолтные инстансы std::exception. Хотя мне нравится, что юззеру должно быть потенциально понятнее, если ошибка будет явно говорить, где она случилась

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants