2

行列が上三角かどうかを判断するコードを書き、それを印刷しようとしています。

while ループ、二重 for ループ、何も試しませんでした。これが私が現在持っている混乱です:

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;
4

4 に答える 4

1

行列が上三角であるかどうかは、下部全体をチェックすることによってのみ判断できます。途中でゼロ以外の要素に遭遇した場合、それが上三角行列ではないことがわかります。下部全体をチェックするまで、その決定を下すことはできません。だからあなたの:

upper = true;

あなたがまだループにいる間のステートメントには論理的な根拠がありません。

この問題は、文字列内の文字検索に似ています。文字列全体をチェックする必要があります。文字列の最後に到達しても、探している文字が見つからなかった場合は、その文字が文字列に含まれていないことを知っていますか(その場合のみ)。行列の問題との唯一の違いは、1つの追加の次元があることです。または、言い換えると、複数の1次元配列で、それぞれが前の配列と比較してサイズが+1であり、それらすべてを検索する必要があります。

于 2012-11-14T21:12:48.103 に答える
1

これはおそらくあなたが探しているものになると思います。注: これは、行列がsquareであると仮定しています。そうでない場合 (つまりm!=n)、すぐに false を返す必要があります。

bool upper = true;
for (i=1; i<m && upper; ++i)
   for (j=0; j<i && (upper = (0 == a[i][j])); ++j);
于 2012-11-14T21:08:59.977 に答える
1

例を見てください:

 |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;
于 2012-11-14T21:08:27.263 に答える
0

この機能が組み込まれているマトリックス ライブラリの使用を検討したことはありますか? 私は Eigen ライブラリを頻繁に使用しますが、構文は非常に使いやすいと思います。また、すぐに慣れるための短くて便利なチュートリアルもあります。

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

于 2012-11-14T21:09:52.637 に答える