для цикла — Проверьте, является ли матрица верхней треугольной (c ++)

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

Я пробовал пока циклы, двойные для циклов, ничего. Вот беспорядок у меня в настоящее время:

int i, j;
int count = 0;
bool upper;

while (upper = true;)
{
for (i=1; i<m; i++)
{
for (j=i-1; j<n; j++)
{
if (a[i] > a[j] && a[i][j] == 0.0)
upper = true;
else if (a[i][j] != 0.0)
upper = false;
}
}
}
//   cout << "Matrix is upper triangular. " << count << endl;

2

Решение

Посмотрите на пример:

 |0|1|2|3|4|5|
0| | | | | | |
1|X| | | | | |
2|X|X| | | | |
3|X|X|X| | | |
4|X|X|X|X| | |
5|X|X|X|X|X| |

Эта матрица имеет верхнюю треугольную форму, все ячейки, помеченные X, равны нулю
Для i-й строки — ячейки {i, 0}, {i, 1}, …, {i, i-1} должны быть равны нулю.

Так что это простая задача:

bool isUpperTriangle = true; // be optimistic!
for (int i = 1; i < SIZE && isUpperTriangle; ++i) // rows
for (int j = 0; j < i && isUpperTriangle; ++j) // columns - see example
if (m[i][j] != 0)
isUpperTriangle = false;
1

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

Является ли матрица верхней треугольной или нет, можно определить только путем проверки всей нижней части. Если по пути вы встретите ненулевой элемент, вы знаете, что он не является верхним треугольником. Вы не можете сделать это определение, пока не проверили всю нижнюю часть. Так что ваши:

upper = true;

Заявление, пока вы все еще в цикле, не имеет логической основы.

Проблема похожа на поиск символов внутри строки. Вам нужно проверить всю строку. Если вы достигли конца строки и все еще не нашли искомого персонажа, тогда (и только тогда) вы знаете, что этот символ отсутствует в строке. Единственная разница с матрицей состоит в том, что теперь у вас есть еще одно измерение. Или, другими словами, несколько одномерных массивов, каждый из которых имеет размер +1 по сравнению с предыдущим массивом, и вам нужно искать их все.

1

Я думаю, что это, вероятно, сделает то, что вы ищете. Примечание: это предполагает, что матрица площадь. Если это не так (т.е. m!=n) вы должны немедленно вернуть false:

bool upper = true;
for (i=1; i<m && upper; ++i)
for (j=0; j<i && (upper = (0 == a[i][j])); ++j);
1

Рассматривали ли вы использовать матричную библиотеку, в которую встроена эта функция? Я использую библиотеку Eigen довольно часто и нахожу синтаксис очень простым в использовании — у них также есть короткое и полезное руководство, чтобы довольно быстро освоиться.

http://eigen.tuxfamily.org/index.php?title=Main_Page

0
По вопросам рекламы [email protected]