计算矩阵中对角线的总和

Posted

技术标签:

【中文标题】计算矩阵中对角线的总和【英文标题】:calculate the sum of diagonals in a matrix 【发布时间】:2012-01-25 18:55:38 【问题描述】:

我需要在 C++ 中计算矩阵中两条对角线的总和,我已经有一个解决方案,但我一定很笨,因为我无法理解它在做什么,所以我想知道是否有另一个版本我能理解。这是完成这项工作的代码:

cout<<"Jepi rangun e  matrices"<<endl;  // pra bejme manipulim me matrice katrore ku rreshtat=kolonat
cin>>n;
cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica

for(i=1;i<=n;i++)

     for(j=1;j<=n;j++)
        cin>>a[i][j];


d=0;
s=0; // ketu e keni kushtin si dhe mbledhjen per te dy diagonalet me dy variabla te ndryshme

for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    
        if(i==j)
            d=d+a[i][j];
        if(j==n-i+1 || i==n-j+1) 
            s=s+a[i][j];
    

比较难理解的部分是

if(j==n-i+1 || i==n-j+1) 
    s=s+a[i][j];

这是我更改的整个代码,但它不适用于辅助对角线:

#include <iostream>
using namespace std;

int main()

    int d=0,s=0; // ketu e keni kushtin si dhe mbledhjen per te dy diagonalet me dy variabla te ndryshme
    int i,j,n;
    int a[5][5];

    cout<<"Jepi rangun e  matrices"<<endl;  // pra bejme manipulim me matrice katrore ku rreshtat=kolonat
    cin>>n;
    cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica

    for(i=1;i<=n;i++)
    
        for(j=1;j<=n;j++)
            cin>>a[i][j];
    

    for(i=1;i<=n;i++)
    
        for(j=1;j<=n;j++)
        
            if(i==j) 
                d+=a[i][j]; //principal diagonal 
            if(i+j==n-1)
                s+=a[i][j];//secondary diagonal

        
    

    cout << d << endl;
    cout << s << endl;
    cin.get();
    cin.get();
    return 0;

【问题讨论】:

您对这段代码的任何部分有什么具体问题吗? @DrewDormann 是的,这就是问题所在: if(j==n-i+1 || i==n-j+1) s=s+a[i][j]; 【参考方案1】:

如果有英文的 cmets 会很好,但是,您的代码可以(第二个循环):

browse all rows
  browse all cells
    if i == j (is in main diagonal):
        increase one sum
    if i == n - i + 1 (the other diagonal)
        increase the second sum

更好更有效的代码(使用n,而不是n^2)是:

for( int i = 0; i < n; i++)
   d += a[i][i];  // main diagonal
   s += a[i][n-i-1]; // second diagonal (you'll maybe need to update index)

这会直接穿过对角线(都在一个循环中!)并且不会穿过其他项目。

编辑:

主对角线坐标为(1,1), (2,2), ..., (i,i)(因此为i == j)。

次对角线具有坐标(在矩阵 3x3 中):(1,3), (2,2),(3,1),通常为:(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)。但是在 C 中,数组是从 0 开始索引的,而不是 1,所以你不需要 +1(可能)。

第二对角线中的所有这些项目都必须满足条件:i == n - j + 1(同样由于 C 的索引从 0 +1 更改为 -1i=0,n=3j=2j = n - i - 1 ))。

您可以在一个循环中实现所有这些(上面的代码)。

【讨论】:

@cyborg n=5; i=0; 这意味着第二个索引 j=6; 超出边界(我假设 j=4 在这种情况下是正确的)。【参考方案2】:
int diag1=0;
int diag2=0;

for (i=0;i<n;i++)
 for (j=0;j<n;j++)

  if(i==j)  diag1+=a[i][j]; //principal diagonal 
  if(i+j==n-1) diag2+=a[i][j];//secondary diagonal

为了更好地理解这个算法,你应该在你的笔记本上画一个矩阵,并用它们在矩阵中的位置编号它的元素,然后逐步应用算法。我 100% 确定你会理解

【讨论】:

是的,我画了矩阵,但我迷路了。但现在我在看到你的代码后明白了,这很有帮助:if(i+j=n-1) 尝试做计算机所做的事情。使用 n=3 和这个值 a(1,1) a(1,2) a(1,3), a(2,1) a( 2,2) a(2,3), a(3,1) a(3,2) a(3,3) (更改数字中的 a)然后进入 for 循环并记下您的 i 和 j 然后检查 if 的 我在 C++ 中尝试过,但它不适用于辅助对角线 好吧,我的算法将其用于 for 循环(i=0;i【参考方案3】:

我试着解释一下这个版本怎么样? :D

代码有3个重要部分:

输入矩阵 计算主对角线(\方向) 计算次对角线(/方向)

他们在这里,解释:

// input elements
for(i=1;i<=n;i++) // from left to right

    for(j=1;j<=n;j++) // from up to down
        cin>>a[i][j]; // input element at (i,j) position

这里,d 和 s 分别包含主要和次要对角线的互值。在 2 个循环结束时,它们将包含结果

for (i=1;i<=n;i++)
     for (j=1;j<=n;j++)
     
        if(i==j)          // major diagonal - if coordinates are the same
           d=d+a[i][j];   // e.g. (1,1), (2,2)
        if(j==n-i+1 || i==n-j+1)  // coordinates of the minor diagonal - check
           s=s+a[i][j];           // e.g. n=3 (3,1) (2,2) ...
      

希望这会有所帮助。

请注意,此代码从 1 而不是 0 开始矩阵坐标,因此您实际上需要为矩阵分配 (n+1)x(n+1) 空间:

double a[n+1][n+1];

使用前。

另外,您提供的代码不是最有效的。它具有O(n^2) 的复杂性,而任务可以在O(n) 中完成,如下所示:

// matrix coordinates now start from 0
for (int i=0; i < n; ++i)
    d += a[i][i]; // major
    s += a[i][n-1-i]; // minor

【讨论】:

【参考方案4】:
int num[5][5]=0; //decleration
int i=0,j=0,sum=0; 
for (int i=0;i<5;i++)

    for (int j=0;j<5;j++)
    
        cin>>num[i][j];
                              //Taking Matrix input

        cout<<endl<<"The Matrix is "<<endl;
    for (int i=0;i<5;i++)
    
        for (int j=0;j<5;j++)
        
            cout<<num[i][j]<<" ";
        
            cout<<endl;               //Displaying the Matrix
                                   
cout<<endl<<"The sum of diagonals of the matrix is "<<endl;
if(i==j) 

    for (i=0;i<5;i++)
    
        for (j=0;j<5;j++)
        
            if (i==j)       //This loop works where i and j will be equal
            
            sum=sum+num[i][j];
            
        
    
    cout<<sum;

else   //Some times the user creates 4 x 3 matrix or so than diagonals not match so. . . 

    cout<<"The sum is not Possible";

【讨论】:

我认为这是这个矩阵最简单的解决方案。 . . .!!【参考方案5】:

您必须使用i + j == n + 1 而不是i + j == n - 1 作为辅助对角线,即

for(i = 1; i <= n; i++)

    for(j = 1; j <= n; j++)
    
        if(i == j) 
            d += a[i][j]; //principal diagonal 
        if(i + j == n+1)
            s += a[i][j];//secondary diagonal

    

【讨论】:

以上是关于计算矩阵中对角线的总和的主要内容,如果未能解决你的问题,请参考以下文章

计算矩阵对角线上的数字总和

矩阵的迹(转)

MATLAB:查找最小化矩阵元素总和的矩阵的缩写版本

n阶行列式计算公式是啥?

谭浩强C程序设计习题6-3思考

矩阵的迹相关性质