Замена строк в матрице
если вы собираетесь поменять местами строку [0] и строку [1], результирующая матрица будет:
вы можете помочь мне получить для этого код на C?
Это домашнее задание? (отметьте, пожалуйста) - Bob
Это домашнее задание? Как определяется ваша матрица? Вы знаете, как поменять местами две переменные типа int? Вы знаете циклы в C? Проявите немного усилий, и оно будет вознаграждено :). - Maciej Hehl
на самом деле это моя домашняя работа. это единственная оставшаяся матричная операция, которую я не знаю, как решить. матрица [100] [100], но строки и столбцы определяются пользователем. на самом деле я уже закончил замену строк, добавление строк, добавление матриц, мульт. так далее. - user420360
спасибо за ссылки mctylr. да, я умею писать для циклов. на самом деле, я пытаюсь понять код обмена строк, а затем просто внести изменения, которые будут соответствовать кодам mt. - user420360
Другое
Есть много, много других способов реализовать «матрицу» в c, но в большинстве случаев они намного сложнее и полезны только в специализированных ситуациях. К тому времени, когда они вам понадобятся, вы сможете ответить на эти вопросы для себя в контексте каждого из них.
ответ дан 23 мая '17, 12:05
еще раз спасибо! Я использую 2-й код. однако, когда я попробовал матрицу 2x3, возникла ошибка. третий столбец или столбец [2] не меняются местами. - user420360
я имею в виду, что элементы строки в последнем столбце не меняются местами - user420360
Я понял это в цикле for. я user420360
ответ дан 23 авг.
Хороший. Самое приятное здесь то, что он работает для Любой реализация с непрерывными строками. - dmckee --- котенок экс-модератора
Хороший ответ, хорошее использование typedef, чтобы сделать код более читабельным. Но я боюсь, что это, скорее всего, не отвечает на OP, так как я подозреваю, что это просто идет ему в голову. - мактилр
Большое спасибо за ответ. Я новичок в C, и мы еще не закончили обсуждение с memcpy - user420360
Я бы, вероятно, поменял местами по одному элементу, чтобы не использовать много дополнительного хранилища. Если вы работаете в основном с такими вещами, как графические преобразования, где матрицы обычно имеют размер 3x3 или 4x4, подход Джеймса Каррана следующий: вероятно Немного лучше. Если вы работаете (или можете работать) с действительно большими матрицами, это сэкономит память и, возможно, будет работать быстрее:
ответ дан 23 авг.
решить это твое домашнее задание?
ответ дан 23 авг.
Вы должны добавить сюда обсуждение; Тем более, что это вопрос новичка. Этот трюк работает из-за семантики присваивания структур. - dmckee --- котенок экс-модератора
Обмен выглядит неплохо. Но это: row[1].m[2] = . отстой. Хм, в том-то и дело, не так ли? - Мацей Хель
Значит, дело было не в этом. Вы действительно хотели, чтобы ответ был полезным, а не просто озорной попыткой наказать ОП? Я бы не догадался. - Мацей Хель
Эй! Это мой первый пост о переполнении стека, я знаю, что он довольно длинный, надеюсь, меня не забанят!
Вероятно, одним из самых элегантных подходов было бы использование функции, которая меняет местами два полученных аргумента, используя ее для обмена компонентами матрицы. Скажем что-нибудь вроде своп (а, б). Как уже многие говорили, мы должны рассмотреть возможность использования вспомогательной переменной
Вы можете легко использовать эту операцию, чтобы поменять местами два элемента (a и b) - я считаю, что это не по теме, но я настоял на этой идее, потому что мне это показалось довольно интересным. Наконец, отвечая на ваш вопрос, вы можете использовать, скажем,
при наличии матрицы, объявленной как
Вы можете использовать свой способ XOR для замены строк, сначала идентифицируя элементы, которые необходимо заменить (в соответствии с индексом строки, как вы уже сказали)
Надеюсь, это будет полезно в вашей дальнейшей практике.
Также попробуйте этот пример, я уверен, что впоследствии вы поймете всю идею намного лучше (не забывайте, что индекс матрицы начинается с 0!)
Поменять местами две заданные строки матрицы
С++. Дан двумерный числовой массив. Составить программу обмена местами заданных двух его строк.
Поменять местами две любые строки матрицы
Дан двумерный массив. Составить программу, которая меняет местами две любые строки массива
Поменять местами две средние строки матрицы с первой и последней
Ребят Добрый вечер помогите написать программу на с++, очень нужно у самого в с++ фактически.
Если массив динамический, то поменять местами указатели, а если статический, то последовательным свопом.
если бездумно и безпошадно:
я сделал так, чтобы человеку было понятно, что он хочет сделать
а почитав форы и кучу левых переменных - он тупо скопирует, не поняв сути задачи
relok, кстати за это вот : Найти сумму всех нечетных трехзначных чисел уважаю. (серьезно, без издевки). Отдельная благодарность от меня.
relok, знаете, насколько я могу судить, люди и Хеллоу Ворлд тупо копируют, не разбираясь, а потом не могут ответить, что это за принтэф там такой.
almazsr, спасибо за ответ, но я хочу увидеть ответ volovzi, а ваш код, извините, но ни в какие ворота по перфомансу не лезет
M128K145, вопрос был про строки. Твой вариант, очевидно, неоптимален для строк. Если используешь указатели, так используй их до конца.
Со столбцами по-другому. Не надо стремиться решить все задачи универсальным способом, иначе выйдет как у "шутника" almazsr'a.
relok, ничего подобного, просто иногда нужно не топорный метод, а что-нибудь гибкое (что-бы уложиться по времени или по памяти). Ваш метод хорош в том что он не оспариваемый. (я над ним не стебусь - ЧЕСТНО. )
valeriikozlov, человеку, задающему такие вопросы (найти сумму всех нечетных 3-ех значных) гибкий метод незачем=) ему нужно разобраться, что такое трехзначные числа, что такое сумма и что такое нечетные числа
типа как в притче - не давай человеку рыбу, а дай удочку
almazsr, спасибо за ответ, но я хочу увидеть ответ volovzi, а ваш код, извините, но ни в какие ворота по перфомансу не лезет
volovzi, понимаете, это простое действие, но если вы будете делать принципиально одинаковые действия, но посложнее обычного обмена строк, но по разному - это к добру не приведет, надо стремится к однообразию в коде, а не созданием множества методов/функций на каждый чих, тем более если проигрыш в быстродействии минимален.
Просто понимаете, проводя аналогию с вашим решением - вот такой код:
Так вот, обычному программисту хватило бы первой функции, вы бы использовали еще и вторую функцию, потому что битовые операции якобы быстрее. Это утрировано конечно, но тем не менее
M128K145, обмен строк и столбцов не являются принципиально одинаковыми действиями ни с точки зрения реализации, ни с точки зрения интерфейса. Для этих действий в любом случае будут написаны две разные функции. А как функция реализована внутри — неважно. Главное, чтобы она была удобна в использовании и работала быстро.
А разница в быстродействии в данном случае огромна — у меня время константное, а у тебя — линейное.
А пример не катит. Вообще-то, в стандартной библиотеке есть разные функции для степени двойки и произвольной степени.
Как поменять местами две строки матрицы без использования подпрограмм?
Как поменять местами две строки матрицы в C++ без использования подпрограмм?
Двумерный массив: поменять местами две строки
В матрице из целых положительных чисел поменять местами две строки: строка, которая содержит.
Двумерный массив: поменять местами две строки
Нужно поменять местами две строки в массиве:строку, которая содержит максимальный элемент.
В матрице поменять местами две строки с заданными номерами
2)Из элементов полученной матрицы, которые лежат на главной диагонали и под ней, сформировать.
Разработать функцию, позволяющую поменять местами две произвольные строки двухмерного массива
Разработать функцию, позволяющую поменять местами две произвольные строки двухмерного массива.
Разработать функцию, позволяющую поменять местами две произвольные строки двухмерного массива
Помогите Разработать функцию, позволяющую поменять местами две произвольные строки двухмерного.
Поменять местами строки матрицы
Дана матрица. программа меняет местами 2 строки.. int m=< , , >;.
Поменять местами строки матрицы
Дана матрица. программа меняет местами 2 строки.. int m=< , , >;.
В динамическом точно так же. Ну, можно еще, через указатели обращаться
Добавлено через 8 минут
Через указатели
Менять местами строки можно проще, и не писать так много кода. Всем известный метод "пузырька" работает на ура
Schutskiy Denic, если вы уберете строку srand(time(NULL)), то у вас числа будут псевдослучайными, т.е. сколько бы раз вы не запускали, у вас переменная i будет принимать всегда одно и то же значение.
помогите пожалуйста создать функцию в которой я буду заполнять массив рандомными цифрами
вот я выделил паиять
Прямой ход метода Гаусса
Сначала запишем расширенную матрицу системы. Для этого в главную матрицу добавляем столбец свободных членов.
Вся суть метода Гаусса заключается в том, чтобы путем элементарных преобразований привести данную матрицу к ступенчатому (или как еще говорят треугольному) виду. В таком виде под (или над) главной диагональю матрицы должны быть одни нули.
Что можно делать:
- Можно переставлять строки матрицы местами;
- Если в матрице есть одинаковые (или пропорциональные) строки, можно удалить их все, кроме одной;
- Можно умножать или делить строку на любое число (кроме нуля);
- Нулевые строки удаляются;
- Можно прибавлять к строке строку, умноженную на число, отличное от нуля.
Решение
и мне надо сделать функцию которая будет заполнять мой массив рандомными цифрами
я не понимаю как посылать в функцию двумерный динамический массив и чтоб его там заполнило а потом работать с этим массивом (
Поменять строки матрицы местами
Есть уменя, по сути, двумерный массив, но созданный нетривиально. Вот так я создаю его на стеке.
Поменять местами строки матрицы с номерами K1 и K2
Дана матрица размера M х N и целые числа K1 и K2(1<K1<K2<M). Поменять местами строки матрицы с.
Поменять строки и столбцы матрицы местами
1) сделать ввод массива размером N x N 2) вывести массив в "перевернутом виде". Перевернутый -.
Поменять местами строки матрицы с максимальным и минимальным элементами
Всем доброго времени суток. Вот задание: "Дана матрица действительных чисел размером 12х8.
Необходимо поменять местами две строки матрицы. Нашел в интернете несколько примеров в которых используется поэлементный обмен. Мне такой код не очень нравится, поэтому я написал свой вариант обмена строк матрицы с использованием ссылочных переменных и указателей, но вот беда - я сам не до конца понимаю как он работает ( он работает, проверял на произвольных матрицах ).
(В данном конкретном случае меняю местами строки в зависимости от четности индекса)
Практическим путем выяснил что " *matrix[i] " возвращает значение первого элемента i-ой строки. Честно говоря, не понятно почему так. Знаю, что имя массива это указатель на его первый элемент, видимо, это как-то связано, но точную логическую цепочку не получается провести.
Ссылочная переменная " temp " получает адрес этого первого элемента i-ой строки.
Как работает " matrix[i+1] = &temp; " не очень понятно.
Зачем вы писали это T &temp = *matrix[i]; - совершенно не понятно. Это лишь запутывает код. Можно было просто написать T *temp = matrix[i]; matrix[i] = matrix[i+1]; matrix[i+1] = temp; . А у вас получился просто кусок кода с "четным количеством несуразностей", в результате чего они компенсируют друг друга.
Да, я уже после сделал так, как вы написали. Буду использовать именно такую версию, но все равно интересно получить объяснение на то, как работает код с ссылочными переменными. Си изучаю недавно, поэтому некоторые нюансы работы с ссылками\указателями не понятны.
Метод Гаусса
Метод Гаусса – наиболее универсальный метод решения СЛАУ (за исключением ну уж очень больших систем). В отличие от рассмотренного ранее метода Крамера, он подходит не только для систем, имеющих единственное решение, но и для систем, у которых решений бесконечное множество. Здесь возможны три варианта.
- Система имеет единственное решение (определитель главной матрицы системы не равен нулю);
- Система имеет бесконечное множество решений;
- Решений нет, система несовместна.
Итак, у нас есть система (пусть у нее будет одно решение), и мы собираемся решать ее методом Гаусса. Как это работает?
Метод Гаусса состоит из двух этапов – прямого и обратного.
Рваные массивы
Если эта операция очень распространена и профилирование показывает, что она занимает много времени, вы можете подумать об использовании реализации матрицы с рваным массивом. Что-то вроде этого:
Самое интересное в этой структуре то, что вы все еще можете получить к ней доступ с помощью [][] обозначение, но операция перестановки строк становится
Рваные массивы имеют два недостатка с вашей точки зрения (ну, три из-за проблем с управлением памятью): они требуют дополнительного хранилища для указателей строк, и вы не можете использовать встроенную инициализацию.
7 ответы
Ответ полностью зависит от того, как реализована ваша «матрица», потому что в языке c такое понятие отсутствует.
Вы используете двумерные массивы?
Или что-то другое?
Ступенчатый вид матрицы
Взгляните на картинку, которая представлена ниже. На ней вы увидите матрицу и схему. Разберемся сначала с матрицей. В линейной алгебре матрица подобного вида называется ступенчатой. Ей присуще одно свойство: если aij является в i-й строке первым ненулевым элементом, то все другие элементы из матрицы, стоящие ниже и левее aij, являются нулевыми (т. е. все те элементы, которым можно дать буквенное обозначение akl, где k>i, а l -1 , при этом обязательно выполняется условие: A × A -1 = A -1 × A = E, т. е. произведение этих матриц равно единичной матрице (у единичной матрицы элементы главной диагонали являются единицами, а остальные элементы равны нулю).
Важный нюанс: в линейной алгебре есть теорема существования обратной матрицы. Достаточное и необходимое условие существования матрицы A -1 – невырожденность матрицы A. При невырожденности det A (определитель) не равен нулю.
Основные шаги, на которых основывается метод Гаусса – Жордана:
- Взгляните на первую строку конкретной матрицы. Метод Гаусса – Жордана можно начинать применять, если первое значение не равно нулю. Если же на первом месте стоит 0, то поменяйте строки местами так, чтобы первый элемент имел отличное от нуля значение (желательно, чтобы число было ближе к единице).
- Разделите все элементы первой строки на первое число. У вас получится строка, которая начинается с единицы.
- Из второй строки вычтите первую строку, умноженную на первый элемент второй строки, т. е. в итоге у вас получится строка, которая начинается с нуля. Аналогичные действия выполните с остальными строчками. Для того чтобы по диагонали получались единицы, делите каждую строку на ее первый ненулевой элемент.
- В итоге вы получите верхнюю треугольную матрицу методом Гаусса – Жордана. В ней главная диагональ представлена единицами. Нижний угол заполнен нулями, а верхний угол – разнообразными значениями.
- Из предпоследней строки вычтите последнюю строчку, умноженную на необходимый коэффициент. У вас должна получиться строка с нулями и единицей. Для остальных строк повторите аналогичное действие. После всех преобразований получится единичная матрица.
Онлайн-калькуляторы
Жизнь современной молодежи, обучающейся в вузах и изучающей линейную алгебру, значительно упростилась. Еще несколько лет назад находить решения систем методом Гаусса и Гаусса – Жордана приходилось самостоятельно. Одни студенты успешно справлялись с задачами, а другие путались в решении, делали ошибки, просили у однокурсников помощи. Сегодня можно при выполнении домашнего задания пользоваться онлайн-калькуляторами. Для решения систем линейных уравнений, поиска обратных матриц написаны программы, которые демонстрируют не только правильные ответы, но и показывают ход решения той или иной задачи.
В интернете есть немало ресурсов со встроенными онлайн-калькуляторами. Матрицы методом Гаусса, системы уравнений решаются этими программами за несколько секунд. Студентам требуется только указывать необходимые параметры (например, количество уравнений, количество переменных).
Основные понятия
Под матрицей в линейной алгебре понимается прямоугольный массив элементов (таблица). Ниже представлены наборы элементов, заключенные в круглые скобки. Это и есть матрицы. Из приведенного примера видно, что элементами в прямоугольных массивах являются не только числа. Матрица может состоять из математических функций, алгебраических символов.
Для того чтобы разобраться с некоторыми понятиями, составим матрицу A из элементов aij. Индексы являются не просто буквами: i – это номер строки в таблице, а j – это номер столбца, в области пересечения которых располагается элемент aij. Итак, мы видим, что у нас получилась матрица из таких элементов, как a11, a21, a12, a22 и т. д. Буквой n мы обозначили число столбцов, а буквой m – число строк. Символ m × n обозначает размерность матрицы. Это то понятие, которое определяет число строк и столбцов в прямоугольном массиве элементов.
Необязательно в матрице должно быть несколько столбцов и строк. При размерности 1 × n массив элементов является однострочным, а при размерности m × 1 – одностолбцовым. При равенстве числа строчек и числа столбцов матрицу именуют квадратной. У каждой квадратной матрицы есть определитель (det A). Под этим термином понимается число, которое ставится в соответствие матрице A.
Еще несколько важных понятий, которые нужно запомнить для успешного решения матриц, – это главная и побочная диагонали. Под главной диагональю матрицы понимается та диагональ, которая идет вниз в правый угол таблицы из левого угла сверху. Побочная диагональ идет в правый угол вверх из левого угла снизу.
Двумерные массивы
Придется вручную перемещать отдельные элементы.
(Вот r1 и r2 - это целые числа, которые были установлены в две строки, которые вы хотите поменять местами) или см. Джеймс' memcpy реализация что вполне может быть быстрее, но требует целых рядов временной памяти.
Пример нахождения обратной матрицы методом Гаусса – Жордана
Для вычисления обратной матрицы нужно записать расширенную матрицу A|E и выполнить необходимые преобразования. Рассмотрим простой пример. На рисунке ниже представлена матрица A.
- Для начала найдем определитель матрицы методом Гаусса (det A). Если этот параметр не окажется равным нулю, то матрица будет считаться невырожденной. Это позволит нам сделать вывод о том, что у A точно есть A -1 . Для вычисления определителя преобразуем матрицу до ступенчатой формы элементарными преобразованиями. Подсчитаем число K, равное числу перестановок строк. Строки мы меняли местами всего 1 раз. Вычислим определитель. Его значение будет равно произведению элементов главной диагонали, умноженному на (–1) K . Результат вычисления: det A = 2.
- Составим расширенную матрицу, добавив к исходной матрице единичную матрицу. Полученный массив элементов будем использовать для нахождения обратной матрицы методом Гаусса – Жордана.
- Первый элемент в первой строке равен единице. Нас это устраивает, т. к. не нужно переставлять строки и делить данную строку на какое-нибудь число. Начинаем работать со второй и третьей строками. Чтобы первый элемент во второй строке превратился в 0, отнимем от второй строки первую строчку, умноженную на 3. Из третьей строчки вычтем первую (умножения не требуется).
- В получившейся матрице второй элемент второй строчки равен –4, а второй элемент третьей строчки равен –1. Поменяем строки местами для удобства. Из третьей строчки вычтем вторую строчку, умноженную на 4. Вторую строчку разделим на –1, а третью – на 2. Получим верхнюю треугольную матрицу.
- Из второй строчки отнимем последнюю строчку, умноженную на 4, из первой строчки – последнюю строчку, умноженную на 5. Далее вычтем из первой строчки вторую строчку, умноженную на 2. С левой стороны мы получили единичную матрицу. Справа находится обратная матрица.
Пример решения СЛУ методом Гаусса – Жордана
На рисунке представлена система линейных уравнений. Требуется найти значения неизвестных переменных, используя матрицу, метод Гаусса – Жордана.
- Составим расширенную матрицу. Для этого вынесем в таблицу коэффициенты и свободные члены.
- Решим матрицу методом Гаусса – Жордана. Из строки № 2 вычтем строку № 1. Из строки № 3 вычтем строку № 1, предварительно умноженную на 2.
- Поменяем местами строки № 2 и 3.
- От строки № 3 отнимем строку № 2, умноженную на 2. Разделим полученную третью строку на –1.
- От строки № 2 отнимем строку № 3.
- От строки № 1 отнимем строку № 2, умноженную на –1. Сбоку у нас получился столбик, состоящий из цифр 0, 1 и –1. Из этого делаем вывод, что x1 = 0, x2 = 1 и x3 = –1.
При желании можно проверить правильность решения, подставив вычисленные значения в уравнения:
- 0 – 1 = –1, первое тождество из системы является верным;
- 0 + 1 + (–1) = 0, второе тождество из системы является верным;
- 0 – 1 + (–1) = –2, третье тождество из системы является верным.
Вывод: используя метод Гаусса – Жордана, мы нашли правильное решение квадратной системы, объединяющей линейные алгебраические уравнения.
Пример решения системы уравнений методом Гаусс
А теперь – пример, чтобы все стало наглядно и понятно. Пусть дана система линейных уравнений, и нужно решить ее методом Гаусса:
Сначала запишем расширенную матрицу:
Теперь займемся преобразованиями. Помним, что нам нужно добиться треугольного вида матрицы. Умножим 1-ую строку на (3). Умножим 2-ую строку на (-1). Добавим 2-ую строку к 1-ой и получим:
Затем умножим 3-ую строку на (-1). Добавим 3-ую строку к 2-ой:
Умножим 1-ую строку на (6). Умножим 2-ую строку на (13). Добавим 2-ую строку к 1-ой:
Вуаля – система приведена к соответствующему виду. Осталось найти неизвестные:
Система в данном примере имеет единственное решение. Решение систем с бесконечным множеством решений мы рассмотрим в отдельной статье. Возможно, сначала Вы не будете знать, с чего начать преобразования матрицы, но после соответствующей практики набьете руку и будете щелкать СЛАУ методом Гаусса как орешки. А если Вы вдруг столкнетесь со СЛАУ, которая окажется слишком крепким орешком, обращайтесь к нашим авторам! Заказать недорого реферат вы можете, оставив заявку в Заочнике. Вместе мы решим любую задачу!
Одним из простейших способов решения системы линейных уравнений является прием, основанный на вычислении определителей (правило Крамера). Его преимущество состоит в том, что он позволяет сразу провести запись решения, особенно он удобен в тех случаях, когда коэффициенты системы являются не числами, а какими-то параметрами. Его недостаток – громоздкость вычислений в случае большого числа уравнений, к тому же правило Крамера непосредственно не применимо к системам, у которых число уравнений не совпадает с числом неизвестных. В таких случаях обычно применяют метод Гаусса.
Системы линейных уравнений, имеющие одно и то же множество решений, называются эквивалентными. Очевидно, что множество решений линейной системы не изменится, если какие-либо уравнения поменять местами, или умножить одно из уравнений на какое-либо ненулевое число, или если одно уравнение прибавить к другому.
Метод Гаусса (метод последовательного исключения неизвестных) заключается в том, что с помощью элементарных преобразований система приводится к эквивалентной системе ступенчатого вида. Сначала с помощью 1-го уравнения исключается x1 из всех последующих уравнений системы. Затем с помощью2-го уравнения исключается x2 из 3-го и всех последующих уравнений. Этот процесс, называемый прямым ходом метода Гаусса, продолжается до тех пор, пока в левой части последнего уравнения останется только одно неизвестное xn. После этого производится обратный ход метода Гаусса – решая последнее уравнение, находим xn; после этого, используя это значение, из предпоследнего уравнения вычисляем xn–1 и т.д. Последним находим x1 из первого уравнения.
Преобразования Гаусса удобно проводить, осуществляя преобразования не с самими уравнениями, а с матрицами их коэффициентов. Рассмотрим матрицу:
называемую расширенной матрицей системы, ибо в нее, кроме основной матрицы системы, включен столбец свободных членов. Метод Гаусса основан на приведении основной матрицы системы к треугольному виду (или трапециевидному виду в случае неквадратных систем) при помощи элементарных преобразованиях строк (!) расширенной матрицы системы.
Пример 5.1. Решить систему методом Гаусса:
Решение. Выпишем расширенную матрицу системы и, используя первую строку, после этого будем обнулять остальные элементы:
получим нули во 2-й, 3-й и 4-й строках первого столбца:
Теперь нужно чтобы все элементы во втором столбце ниже 2-й строки были равны нулю. Для этого можно умножить вторую строку на –4/7 и прибавить к 3-й строке. Однако чтобы не иметь дело с дробями, создадим единицу во 2-й строке второго столбца и только
Теперь, чтобы получить треугольную матрицу, нужно обнулить элемент четвертой строки 3-го столбца, для этого можно умножить третью строку на 8/54 и прибавить ее к четвертой. Однако чтобы не иметь дело с дробями поменяем местами 3-ю и 4-ю строки и 3-й и 4-й столбец и только после этого произведем обнуление указанного элемента. Заметим, что при перестановке столбцов меняются местами, соответствующие переменные и об этом нужно помнить; другие элементарные преобразования со столбцами (сложение и умножение на число) производить нельзя!
Последняя упрощенная матрица соответствует системе уравнений, эквивалентной исходной:
Отсюда, используя обратный ход метода Гаусса, найдем из четвертого уравнения x3= –1; из третьего x4 = –2, из второго x2 = 2 и из первого уравнения x1= 1. В матричном виде ответ записывается в виде
Мы рассмотрели случай, когда система является определенной, т.е. когда имеется только одно решение. Посмотрим, что получится, если система несовместна или неопределенна.
Пример 5.2. Исследовать систему методом Гаусса:
Решение. Выписываем и преобразуем расширенную матрицу системы
Записываем упрощенную систему уравнений:
Здесь, в последнем уравнении получилось, что 0=4, т.е. противоречие. Следовательно, система не имеет решения, т.е. она несовместна. à
Пример 5.3. Исследовать и решить систему методом Гаусса:
Решение. Выписываем и преобразуем расширенную матрицу системы:
В результате преобразований, в последней строке получились одни нули. Это означает, что число уравнений уменьшилось на единицу:
Таким образом, после упрощений осталось два уравнения, а неизвестных четыре, т.е. два неизвестных "лишних". Пусть "лишними", или, как говорят, свободными переменными, будут x3 и x4. Тогда
Записанное подобным образом решение называется общим, поскольку, придавая параметрам a и b различные значения, можно описать все возможные решения системы. à
Вернуться на главную страницу. или ЗАКАЗАТЬ РАБОТУ
Отключите adBlock!
и обновите страницу (F5)
очень нужно
Линейная алгебра, которая преподается в вузах на разных специальностях, объединяет немало сложных тем. Одни из них связаны с матрицами, а также с решением систем линейных уравнений методами Гаусса и Гаусса – Жордана. Не всем студентам удается понять эти темы, алгоритмы решения разных задач. Давайте вместе разберемся в матрицах и методах Гаусса и Гаусса – Жордана.
Обратный ход метода Гаусса
После того как мы преобразуем систему таким образом, одна неизвестная Xn становится известна, и можно в обратном порядке найти все оставшиеся неизвестные, подставляя уже известные иксы в уравнения системы, вплоть до первого.
Когда интернет всегда под рукой, можно решить систему уравнений методом Гаусса онлайн. Достаточно лишь вбить в онлайн-калькулятор коэффициенты. Но согласитесь, гораздо приятнее осознавать, что пример решен не компьютерной программой, а Вашим собственным мозгом.
4 ответа 4
Необходимо поменять местами две строки матрицы.
Во-первых, надо определиться, каким образом объявляется матрица.
Самый простой подход - это объявить матрицу в виде двумерного массива. Например,
В этом случае приведенная вами функция не годится, то есть не будет работать, так как она принимает указатель на указатель в качестве аргумента, а не двумерный массив.
Для вашей функции матрица определяется скорей всего динамически (хотя в частном случае это может быть и локальный массив) как указатель на динамически выделенный одномерный массив, элементы которого в свою очередь являются указателями на динамически выделенные одномерные массивы.
Теперь указатель a можно передать в вашу функцию в качестве первого аргумента.
Внутри этой функции обмениваются соседние элементы динамически созданного массива a , которые являются указателями на первые элементы других выделенных динамически массивов, как
Здесь выражение matrix[i] дает значение элемента, то есть значение указателя, в i-ом элементе массива matrix . Этот указатель содержит адрес первого элемента i-го динамически выделенного массива.
объявляет ссылку на этот первый элемент i-го . Поэтому если взять адрес этого первого элемента, используя ссылку
то значение выражения &item будет равно значению, хранящемся в выражении matrix[i] .
Эквивалентный код может выглядеть следующим образом
Имейте в виду, что есть стандартная функция std::swap , объявленная в заголовке . которая выполняет данную операцию. С помощью этой функции вы могли бы просто написать
Ниже представлена демонстрационная программа, которая использует два подхода к определению матрицы: первый - в виде массива и второй - в виде набора динамических массивов.
Вывод программы на консоль:
Указатель matrix содержит адрес указателья(является указателем на указатель). matrix[i] это указатель (matrix + i) , *matrix[i] это первый элемент в массиве(строке) matrix + i .
означает, что первому элементу i - той строки придаем имя temp
теперь matrix[i] указывает на начало того же массива, что и matrix[i + 1]
matrix[i+1] = &temp; теперь i + 1 - тый указатель получает значение: адрес первого элемента i - той строки, равно, указывает на строку i
Практически вы могли бы написать функцию проще:
В представленном коде происходит следующее:
Эта шаблонная функция первым аргументом принимает указатель на указатель на какой-то тип. Судя по всему, предполагается, что этот тип является элементарным. Например, int , float , double .
Исходя из того, что matrix - это указатель на указатель, ваша матрица представлена как массив, в котором хранятся указатели на массивы (строки), в которых хранятся сами элементы:
Где matrix - это указатель, в котором хранится адрес массива ABC ;
Происходит обход всей матрицы по строкам. Здесь сразу видны две проблемы:
- Нет контроля значения переменной rowsQuantity ;
- Переменная типа int не вполне подходит для адресации элементов массива. Переменная типа size_t подойдет гораздо лучше.
Действия выполняются при посещении каждой строки, чей индекс кратен двум (0, 2, 4, и пр.). И действия, соответственно, выполняются попарно над строками 0-1, 2-3, 4-5.Это не совсем рационально, потому что такой подход выполняет в два раза больше инкрементов переменной i , в два раза больше делений с остатком и в два раза больше сравнений, чем реально необходимо.
Гораздо рациональнее было бы выполнять i += 2 , вообще отбросив деление с остатком и проверку. Но такой подход потребует выполнение проверки целочисленного переполнения переменной i .
На первый взгляд, это довольно идиоматическая запись, необходимая для классического обмена местами двух значений с использованием промежуточной переменной:
Но не совсем. Я не уверен до конца, что происходит в недрах компилятора, и что по этому поводу говорит Стандарт .
matrix[i] - получает значение указателя на строку матрицы (адрес массива со значениями строки). * - разыменовывает данный адрес, получая значение (значения) всей строки. По всей видимости, значение строки помещается в ссылочную переменную temp .
Я не специалист по C++ , но мне данный код кажется очень странным. По логике, ссылка является сущностью времени компиляции, иначе говоря - это просто всевдоним для чего-то. То есть, эти три странные строчки можно свести к двум:
В результате чего и в x , и в y будет находится изначальное значение y . Но, по-видимому, компилятор в принципе понимает, что вы от него хотите. А может быть, это неопределенное поведение. Точно сказать не могу, потому что текущий стандарт C++ занимает почти 2000 страниц.
Здесь происходит использование адреса данных, связанных со ссылкой temp .
PS. Я бы рекомендовал как можно реже и меньше смешивать C++ с его C подмножеством. Не потому, что C плохо, а потому что такое смешивание имеет ряд существенных минусов.
Во-первых, низкоуровневая явность C несовместима с высокоуровневой неявностью C++ . Это гарантированно будет приводить к трудным для понимания ошибкам даже во вполне тривиальном коде. Так же это будет вынуждать вас писать еще больше кода, чем при использовании одного только C - вот такой парадокс.
Во-вторых, смешивание ссылок с указателями, шаблонов с макросами и исключений с кодами возврата приводит к неподдающимся анализу ситуациям, потому что названные элементы противоречивы в деталях, хотя поверхностно кажутся очень похожими.
Сегодня разбираемся с методом Гаусса для решения систем линейных алгебраических уравнений. О том, что это за системы, можно почитать в предыдущей статье, посвященной решению тех же СЛАУ методом Крамера. Метод Гаусса не требует каких-то специфических знаний, нужна лишь внимательность и последовательность. Несмотря на то что с точки зрения математики для его применения хватит и школьной подготовки, у студентов освоение этого метода часто вызывает сложности. В этой статье попробуем свести их на нет!
Ряд как структура
C не поддерживает присвоение формы массивам;
но это делает поддерживать семантику присваивания по значению для структур. Это дает вам реализацию, предложенную несколькими людьми без объяснения причин:
что гладко. Для этого требуется целый ряд памяти, но, если компилятор хорош, скорее всего, он будет быстрым. Большим недостатком является то, что вы не можете адресовать отдельные элементы матрицы с помощью [][] синтаксиса больше. Скорее ты пишешь m[i].r[j] ;
Читайте также: