#c #matrix-inverse
#c #матрица-обратная
Вопрос:
В настоящее время я работаю над реализацией метода инверсии матрицы для класса Matrix в C . Одна вещь, которая не реализована, — это проверка того, когда элемент pivot равен 0, что означает, что мне нужно будет поменять местами его значения с значениями другой приемлемой строки. Я использую элемент diagonal в качестве элемента pivot, если это поможет.
Вот что у меня есть для метода инверсии:
Matrix Matrix:: invert()
{
if (rows != cols) { // Check for square matrix
cout << "Matrix must be square." << endl;
exit(1);
}
double ratio, sum;
int i, j, k;
Matrix T1(rows, cols*2); // New temp identity matrix of same order
Matrix F(rows, cols); // Final Inverted Matrix
// Add Identity Matrix
for(i = 1; i <= rows; i ){
for(j = rows; j <= 2*rows; j ){
if(i == (j-cols)){
T1.el[i][j] = 1.0;
}
else
T1.el[i][j] = 0.0;
}
}
// Add original Matrix to 1st half of Temp Matrix
for (i = 1; i <=rows; i ) {
for(j=1;j<=rows; j ) {
T1.el[i][j] = el[i][j];
}
}
cout << "nnOriginal matrix with added Identity Matrix" << endl;
for (i = 1; i <=rows; i ) {
cout << setw(5);
for(j=1;j<=rows*2; j ) {
cout << T1.el[i][j] << setw(6);
}
cout << endl;
}
// Row Operations
for(i = 1; i <= rows; i ){
for(j = 1; j <= rows; j ){
if(i != j) {
ratio = T1.el[j][i]/T1.el[i][i];
for(k = 1; k <= 2*rows; k ) {
T1.el[j][k] -= ratio * T1.el[i][k];
}
}
}
}
// backwards substitutions
for(i = 1; i <= rows; i ){
sum = T1.el[i][i];
for(j = i 1; j <= 2*rows; j ){
T1.el[i][j] /= sum;
}
}
// Copy to return Matrix
for(i=1; i<=rows; i ){
for (j=1; j<=rows; j ) {
F.el[i][j] = T1.el[i][j cols];
}
}
return F;
}
Как или где я мог бы добавить эту функциональность / проверить?
Спасибо.
Комментарии:
1. Какое выражение в этих подпрограммах вы бы назвали
pivot
, если бы собирались присвоить ему выделенную переменную?2. Поскольку я использую диагонали в качестве элементов pivot, я предполагаю, что любое значение T1.el[i] [i] будет соответствовать текущей диагонали и, следовательно, элементу pivot. Итак, я бы добавил проверку на ноль в разделе операций со строками прямо перед вычислением соотношения? Спасибо.
3. Звучит как план, который стоит попробовать. 🙂