Как сделать треугольную матрицу в c

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Данная статья является первой частью серии статей под названием "Решение матриц". Каждая часть сопровождается теорией, примерами и подробным описанием.

Если Вам нужно привести матрицу к треугольному (ступенчатому) виду, воспользуйтесь нашим онлайн калькулятором.

Содержание:

Введение

Эту задачу приходится решать очень часто, так как она используется во многих операциях над матрицами (решение систем линейных алгебраических уравнений (СЛАУ), вычисление определителя матрицы).

Что бы привести матрицу к треугольному виду, нужно воспользоваться методом Гаусса, который является простым в использовании и позволяет быстро прийти к конечному результату. Метод заключается в том чтобы исходную матрицу, путём элементарных преобразований привести к треугольному (ступенчатому) виду.

Описание алгоритма

Для приведения матрицы к треугольному виду, необходимо обнулить все элементы стоящие ниже главной диагонали.

Пусть дана матрица

Первым действием обнуляем первые элементы 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, я не могу понять по какому алгоритму у меня.

Данный класс позволяет производить некоторые операции над матрицами:

  1. Сложение матрицы А с матрицой Б
  2. Вычитание матрицы Б из матрицы А
  3. Умножение матрицы А на матрицу Б
  4. Умножение матрица А на число
  5. Проверка матрицы А на единичность
  6. Выполнение нексольких операций над матрицами одновременно, образуя матрицу 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 ),

С помощью приведенной выше информации вы можете написать функции, которые:

  1. Выделите нужное количество памяти для верхней треугольной матрицы
  2. Установить значение матрицы с учетом индекса строки ( i ) и индекс столбца ( j ).
  3. Получить значение матрицы с учетом индекса строки ( i ) и индекс столбца ( j ).

Этого должно быть достаточно для умножения верхней треугольной матрицы на другую верхнюю треугольную матрицу, а также на регулярную матрицу.

Другие решения

Я бы подошел к этому, начав с определения умножения матриц в форме индекса.

Теперь вам нужен способ отобразить индексы в ваш 1D-массив из i, j и обратно.

Тогда ваша функция выглядит просто как

Это не оптимально, как внутренний k петля может быть уменьшена в размере.

Читайте также: