【问题标题】:Check if matrix is upper triangular (c++)检查矩阵是否为上三角(c++)
【发布时间】:2012-11-03 10:32:46
【问题描述】:

我一直在尝试编写代码来确定矩阵是否为上三角形,然后打印出来。

我试过 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;

【问题讨论】:

  • Isn't i in for statement start from 0upper = true 是赋值而不是比较。另外,如果程序没有编译,也请告诉我们错误。
  • 你不需要 while 循环。也应该是while (true == upper)
  • 当你到达upper = true 时突破。否则它很可能会在完成之前进入upper = false。
  • 另外纠正我,但在线性代数中,成为上三角形所需的唯一条件是所有 i > j 的 A[i][j] = 0。顶部三角形也可以用零填充,但左下角必须是;正确吗?
  • 我认为“a[i] > a[j]”不应该在里面。

标签: c++ for-loop while-loop triangular


【解决方案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;

【讨论】:

    【解决方案2】:

    矩阵是否为上三角形只能通过检查整个下部来确定。如果你在途中遇到一个非零元素,你就知道它不是上三角形。在检查整个下部之前,您无法做出决定。所以你的:

    upper = true;
    

    你还在循环中的陈述没有逻辑依据。

    这个问题类似于字符串中的字符搜索。您需要检查整个字符串。如果您到达字符串的末尾,但仍然没有找到您要查找的字符,那么(并且只有那时)您是否知道该字符不在字符串中。与矩阵问题的唯一区别是您现在多了一个维度。或者,换句话说,多个一维数组,每个数组的大小都比前一个数组大 1,你必须搜索它们。

    【讨论】:

      【解决方案3】:

      我认为这可能会满足您的需求。注意:这里假设矩阵是正方形。如果不是(即m!=n),则应立即返回 false:

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

      【讨论】:

        【解决方案4】:

        您是否考虑过使用内置此功能的矩阵库?我经常使用 Eigen 库,我发现它的语法非常易于使用 - 他们还有一个简短而有用的教程,可以让我很快熟悉。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-19
          • 1970-01-01
          • 2011-06-16
          • 2013-05-17
          • 2017-10-08
          • 1970-01-01
          相关资源
          最近更新 更多