Как я могу сделать программу на С++, чтобы найти определенную и обратную матрицу любого размера?

Я знаю, как найти их в 1x1, 2x2 и 3x3, но я хочу сделать программу, которая позволит мне вводить размеры моей матрицы, а затем вводить числа, которые входят в матрицу. После ввода чисел я хочу, чтобы он дал детерминант (если можно его получить) и обратную матрицу, но я не знаю, как обойти часть размеров. С чего начать? Какие заголовки следует использовать? Я работаю в Linux, поэтому у меня нет некоторых заголовков, как в Windows, если это кому-то поможет. :)


person Matthew    schedule 19.02.2013    source источник
comment
Во-первых, понимаете ли вы (бумажную) математику, лежащую в основе определения определителя матрицы NxN? И найти обратную матрицу NxN?   -  person Cornstalks    schedule 20.02.2013
comment
Вы должны узнать о том, как вы делаете это на бумаге (т.е. изучить математику, стоящую за этим), тогда вам это станет ясно. Если конечно вы хотите просто инвертировать матрицы, а не писать это самостоятельно, то можно использовать библиотеку типа Eigen.   -  person us2012    schedule 20.02.2013
comment
Предположим, что матрица квадратная, то, что вы, вероятно, ищете, это алгоритм обращения матрицы на месте. Вам следует проверить math.stackexchange. ком/вопросы/16940/   -  person user2051349    schedule 20.02.2013
comment
Чтобы уточнить: вы спрашиваете, как вводить и хранить матрицы произвольного размера, или речь идет о поиске определителя/обратного?   -  person user634618    schedule 20.02.2013
comment
ввод произвольного размера и всех чисел в матрице, затем поиск обратного и определителя. И спасибо! :) Алгоритм бы очень помог! Я слышал, что массивы хороши для такого рода вещей, но я не знаю, как использовать массивы... (я довольно просто придерживался iostream. LOL. Imma newb.) плюс я должен с чего-то начать, и как только я разберитесь с этим, я уверен, что это станет немного легче! :D   -  person Matthew    schedule 20.02.2013
comment
и да, я знаю, как найти определитель матрицы любого размера. :)   -  person Matthew    schedule 20.02.2013


Ответы (2)


Начните с выбора книги по линейной алгебре. Один Гилберт Странг. Она читается как хорошая книга рассказов. Пройдите декомпозицию LU и далее в собственные значения и собственные векторы. Где-то по пути вы бы нашли ответ на оба своих вопроса.

person shashydhar    schedule 19.02.2013

Простым способом сделать это было бы использование такой библиотеки, как Eigen.

Если вы действительно хотите сделать это сами, вы должны

  1. решить, как представить вашу матрицу в памяти,
  2. написать код для чтения и хранения матрицы в соответствии с вашим определением, и
  3. напишите код для вычисления обратного/определителя матрицы в соответствии с вашим определением.

Очевидно, что 2. и 3. зависят от вашего выбора для 1., и поиск хорошего представления не тривиален и зависит от вашего приложения, например. насколько большой будет ваша матрица, будет ли она разреженной или плотной.

Если вы не заботитесь об эффективности или просто предполагаете, что ваша матрица мала, вы можете представить свою матрицу в виде одномерного вектора. Например, если у вас есть матрица 4x4, вы можете выделить вектор длиной 16.

Если я правильно понял ваш вопрос, вы на самом деле спрашивали о том, как это сделать динамически (во время выполнения). Используя массивы, это выглядит примерно так:

double* yourMatrix
yourMatrix = new double[columnCount * rowCount];

Это динамически выделяет пространство для columnCount * rowCount doubles, и теперь вы можете получить доступ к этой памяти как к статическому массиву. Когда вы закончите, вы должны delete[] yourMatrix предотвратить утечку памяти.

Если вы знаете, как вычислить определитель/инверсию на бумаге, вы сможете перейти отсюда.

person user634618    schedule 20.02.2013