Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ задания 2-3.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
75.78 Кб
Скачать

4) Вещественная матрица (matrix)

Вещественным числом считается тип double. Нужно реализовать вещественную матрицу -- понятие линейной алгебры. Нужно обеспечить пользователя класса естественным интерфейсом для работы с матрицами и составления вычислительных программ. Для удобства тестирования и отладки введем строковое представление матрицы, похожее за инициализатор двумерного массива. Так, строка «{{1, 0, 0}, {0, 1, 0.5}}» обозначает матрицу 2 на 3:

| 1 0 0 |

| 0 1 0.5 |

Пробелы в строке не имеют значения. Теперь можно кратко записывать проверки вида:

if( matrix::identity( 2 ) != matrix( "{{1,0},{0,1}}" ) )

error( "matrix::identity" );

Обязательные операции:

matrix( int n, int m ) // размера n на m из 0.0

matrix( double ) // 1 на 1 с этим элементом

matrix( double*, int m ) // матрица-строка из массива длины m

matrix( int n, double* ) // матрица-столбец из массива длины n

matrix( char* ) // из строкового представления (см. выше)

static matrix matrix::identity( int n ) // возвращает единичную матрицу размера n

static matrix matrix::diagonal( double* vals, int n ) // возвращает

// диагональную матрицу размера n с заданными элементами по главной диагонали

int matrix::rows() // число строк

int matrix::columns() // число столбцов

matrix::set( int i, int j, double val ) // присвоить значение элементу [i][j].

matrix matrix::matrix[ i ] // i-я строка в виде новой матрицы

matrix matrix::matrix[ j ] // j-й столбец в виде новой матрицы

// таким образом, становится возможным обращение: m[1][2],

// но только на чтение, т.к. конструируются новые объекты-матрицы и

// исходные значения становятся недоступны на запись.

// как этого избежать и допустить присваивание в таком же стиле --

// см. дополнительные возможности.

// все арифметические операции выбрасывают исключение,

// если матрицы несовместимы по размерам

matrix + matrix

matrix += matrix

matrix - matrix

matrix -= matrix

matrix * matrix

matrix *= matrix

-matrix // унарный минус, применить ко всем элементам

matrix == matrix // точность сравнения задана статической константой matrix::EPS

matrix != matrix

Дополнительные возможности:

!matrix // обратная матрица

matrix | matrix // конкатенировать (приписать) матрицы вертикально

// (вторую справа от первой)

matrix / matrix // конкатенировать (приписать) матрицы горизонально

// (вторую под первой)

// реализовать операции индексирования эффективно:

// избежать копирования (конструирования) строк и столбцов.

// обеспечить возможность присваивания вида m[1][2] = 5.0;

double matrix::determinant() // определитель

matrix matrix::solve() // решить любым способом неоднородную систему из n линейных

// алгебраических уравнений с n неизвестными, представленную матрицей

// размера n на (n+1). Вернуть решение в виде матрицы 1 на n.

// выбросить исключение в случае неразрешимости системы (опять же, с учетом EPS)

// обязательно запиште какой-нибудь тест в таком виде:

// x = (A|b).solve(); if( A*x != b ) { error( "solve" ); }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]