Как сделать треугольную матрицу в c
Данная статья является первой частью серии статей под названием "Решение матриц". Каждая часть сопровождается теорией, примерами и подробным описанием.
Если Вам нужно привести матрицу к треугольному (ступенчатому) виду, воспользуйтесь нашим онлайн калькулятором.
Содержание:
Введение
Эту задачу приходится решать очень часто, так как она используется во многих операциях над матрицами (решение систем линейных алгебраических уравнений (СЛАУ), вычисление определителя матрицы).
Что бы привести матрицу к треугольному виду, нужно воспользоваться методом Гаусса, который является простым в использовании и позволяет быстро прийти к конечному результату. Метод заключается в том чтобы исходную матрицу, путём элементарных преобразований привести к треугольному (ступенчатому) виду.
Описание алгоритма
Для приведения матрицы к треугольному виду, необходимо обнулить все элементы стоящие ниже главной диагонали.
Пусть дана матрица
Первым действием обнуляем первые элементы 2,3. n строки, для этого вычтем из этих строк первую строку умноженную на соответственно,
Теперь вычтем из 3,4. n строки вторую строку умноженную на , этим действием обнуляем вторые элементы этих строк, соответственно, получаем
где bij элементы получившиеся в результате этих преобразований. И так далее, пока не получим вид ,
где bij это элементы получившиеся в результате элементарных преобразований, это и есть матрица треугольного вида.
Пример приведения матрицы к треугольному виду
Заключение
Если Вам не понятен какой-либо шаг или у Вас есть вопросы по приведению матрицы к треугольному (ступенчатому) виду, вы всегда можете оставить свой комментарий ниже или решить её воспользовавшись нашим онлайн калькулятором.
Матрица — это двумерный массив, каждый элемент которого имеет два индекса: номер строки и номер столбца, поэтому для работы с элементами матрицы необходимо использовать два цикла. Если значениями параметра первого цикла будут номера строк матрицы, то значениями параметрами второго — столбцы (или наоборот). Обработка матрицы заключается в том, что вначале поочередно рассматриваются элементы первой строки (столбца), затем второй и т.д. до последней.
Перед тем, как приступить к изучению алгоритмов обработки матриц, давайте рассмотрим, как описываются матрицы в C++. Двумерный массив можно объявить так:
тип имя_переменной [n] [m];
Здесь тип определяет тип элементов массива, имя_переменной — имя матрицы, n — количество строк, m — количество столбцов. Строки нумеруются от 0 до n-1, столбцы от 0 до m-1.
Например int h[10] [15];
Выше матрица целых чисел h, состоящая из 10 строк и 15 столбцов (строки нумеруются от 0 до 9, столбцы от 0 до 14).
Для обращения к элементу матрицы необходимо указать ее имя и в квадратных скобках номер строки, затем номер столбца. Например, h[2] [5].
Ввод-вывод матриц
Матрицы, как и одномерные массивы, нужно вводить (выводить) поэлементно. Блок-схема ввода элементов матрицы A[n] [m] изображена ниже:
Код программы на Visual C++ вода-вывода матрицы будет иметь примерно такой вид:
Многомерным называется такой массив, который отличается двумя или более измерениями, причем доступ к каждому элементу такого массива осуществляется с помощью определенной комбинации двух или более индексов. Многомерный массив индексируется двумя и более целыми числами.
Двумерные массивы
Простейшей формой многомерного массива является двумерный массив. Местоположение любого элемента в двумерном массиве обозначается двумя индексами. Такой массив можно представить в виде таблицы, на строки которой указывает один индекс, а на столбцы — другой. Пример объявления и инициализации двумерного массива показан ниже:
Обратите особое внимание на способ объявления двумерного массива. Схематическое представление массива myArr показано ниже:
Массивы трех и более измерений
Ниже приведен пример программы, использующей трехмерный массив:
Инициализация многомерных массивов
Для инициализации многомерного массива достаточно заключить в фигурные скобки список инициализаторов каждого его размера:
где val обозначает инициализирующее значение, а каждый внутренний блок — отдельный ряд. Первое значение в каждом ряду сохраняется на первой позиции в массиве, второе значение — на второй позиции и т.д. Обратите внимание на то, что блоки инициализаторов разделяются запятыми, а после завершающей эти блоки закрывающей фигурной скобки ставится точка с запятой.
Ниже в качестве примера приведена общая форма инициализации двумерного массива:
Как создать квадратную матрицу?
Создать квадратную матрицу чисел порядка n
Создать квадратную матрицу чисел порядка n. Найти сумму и произведение элементов, расположенных.
Получить квадратную матрицу
В данной действительной квадратной матрице порядка n найти наименьший по модулю элемент. Получить.
Построить квадратную матрицу
Помогите пожалуйста построить квадратную матрицу n*n, я не могу понять по какому алгоритму у меня.
Данный класс позволяет производить некоторые операции над матрицами:
- Сложение матрицы А с матрицой Б
- Вычитание матрицы Б из матрицы А
- Умножение матрицы А на матрицу Б
- Умножение матрица А на число
- Проверка матрицы А на единичность
- Выполнение нексольких операций над матрицами одновременно, образуя матрицу D
Так же он содержит операторы перегрузки и скрытые поля для соблудения инкапсуляции.
using System ;
using System . Collections . Generic ;
using System . Linq ;
using System . Text ;
using System . Threading . Tasks ;
namespace ConsoleApplication1
public int N
set 0 ) n = value ; >
>
// Задаем аксессоры для работы с полями вне класса Matrix
public Matrix ( int n )
public int this [ int i , int j ]
set
>
// Ввод матрицы с клавиатуры
public void WriteMat ()
: " , i + 1 , j + 1 ) ;
mass [ i , j ] = Convert . ToInt32 ( Console . ReadLine ()) ;
>
>
>
// Вывод матрицы с клавиатуры
public void ReadMat ()
Console . WriteLine () ;
>
>
// Проверка матрицы А на единичность
public void oneMat ( Matrix a )
>
>
if ( count == a . N )
else Console . WriteLine ( " Не единичная " ) ;
>
// Умножение матрицы А на число
public static Matrix umnch ( Matrix a , int ch )
>
return resMass ;
>
// Умножение матрицы А на матрицу Б
public static Matrix umn ( Matrix a , Matrix b )
public static Matrix operator * ( Matrix a , int b )
// Метод вычитания матрицы Б из матрицы А
public static Matrix razn ( Matrix a , Matrix b )
>
return resMass ;
>
// Перегрузка оператора вычитания
public static Matrix operator — ( Matrix a , Matrix b )
public static Matrix Sum ( Matrix a , Matrix b )
>
return resMass ;
>
// Перегрузка сложения
public static Matrix operator + ( Matrix a , Matrix b )
// Деструктор Matrix
static void Main ( string [] args )
<
Console . WriteLine ( " Введите размерность матрицы : " ) ;
int nn = Convert . ToInt32 ( Console . ReadLine ()) ;
// Инициализация
Matrix mass1 = new Matrix ( nn ) ;
Matrix mass2 = new Matrix ( nn ) ;
Matrix mass3 = new Matrix ( nn ) ;
Matrix mass4 = new Matrix ( nn ) ;
Matrix mass5 = new Matrix ( nn ) ;
Matrix mass6 = new Matrix ( nn ) ;
Matrix mass7 = new Matrix ( nn ) ;
Matrix mass8 = new Matrix ( nn ) ;
Console . WriteLine ( " ввод Матрица А : " ) ;
mass1 . WriteMat () ;
Console . WriteLine ( " Ввод Матрица B : " ) ;
mass2 . WriteMat () ;
Console . WriteLine ( " Матрица А : " ) ;
mass1 . ReadMat () ;
Console . WriteLine () ;
Console . WriteLine ( " Матрица В : " ) ;
Console . WriteLine () ;
mass2 . ReadMat () ;
Console . WriteLine ( " Сложение матриц А и Б : " ) ;
mass4 = ( mass1 + mass2 ) ;
mass4 . ReadMat () ;
Console . WriteLine ( " Вычитание матриц А и Б : " ) ;
mass6 = ( mass1 — mass2 ) ;
mass6 . ReadMat () ;
Console . WriteLine ( " Умножение матриц А и Б : " ) ;
mass8 = ( mass1 * mass2 ) ;
mass8 . ReadMat () ;
Console . WriteLine ( " Умножение матрицы А на число 2 : " ) ;
mass5 = ( mass1 * 2 ) ;
mass5 . ReadMat () ;
Console . WriteLine ( " Матрица D по формуле D = 3AB + ( A — B ) A : " ) ;
mass7 = ( ( mass1 * 3 ) * mass2 + ( mass1 — mass2 ) * mass1 ) ;
mass7 . ReadMat () ;
Я делаю верхнее треугольное матричное умножение в C ++. Эти матрицы хранятся в одномерном массиве вместо обычных двумерных массивов. Значение хранится внутри массива от строки к строке, а 0 в нижней части игнорируются. Я много занимался математикой, пытаясь выяснить закономерность, но все еще не могу придумать алгоритм. Предположим, у меня есть 2 матрицы, каждая из которых имеет квадратную форму, и оба эти значения хранятся в одномерном массиве A и B. И я хочу сохранить результаты в массиве C. Я думаю, что самое сложное — это добавить различное число изменение элементов при выполнении цикла for.
Кто-нибудь может дать мне вдохновение?
Решение
Допустим, полная матрица имеет размер N x N ,
В первом ряду row = 0 , имеются N элементы.
Во втором ряду row = 1 , имеются N - 1 элементы.
В k-м ряду row = k , имеются N - k элементы.
Вот диаграмма ASCII:
Количество элементов, необходимых в одномерном массиве для хранения такой матрицы:
Чтобы получить доступ к элементу матрицы, нам нужно сопоставить индекс строки и индекс столбца с индексом в массиве 1D.
Чтобы получить j столбец первой строки (индекс строки = 0 , индекс столбца = j ),
Чтобы получить j столбец второй строки (индекс строки = 1 , индекс столбца = j ),
Чтобы получить j столбец третьей строки (индекс строки = 2 , индекс столбца = j ),
Чтобы получить j столбец i -ая строка (индекс строки = i , индекс столбца = j ),
С помощью приведенной выше информации вы можете написать функции, которые:
- Выделите нужное количество памяти для верхней треугольной матрицы
- Установить значение матрицы с учетом индекса строки ( i ) и индекс столбца ( j ).
- Получить значение матрицы с учетом индекса строки ( i ) и индекс столбца ( j ).
Этого должно быть достаточно для умножения верхней треугольной матрицы на другую верхнюю треугольную матрицу, а также на регулярную матрицу.
Другие решения
Я бы подошел к этому, начав с определения умножения матриц в форме индекса.
Теперь вам нужен способ отобразить индексы в ваш 1D-массив из i, j и обратно.
Тогда ваша функция выглядит просто как
Это не оптимально, как внутренний k петля может быть уменьшена в размере.
Читайте также: