在矩阵

时间:2017-06-02 19:11:52

标签: c++ matrix parallel-processing elements

我必须创建一个程序,找到与主对角线平行的矩阵元素的总和。我不知道如何找到与主对角线平行的元素。 i == j仅适用于主对角线。假设我们有一个这样的矩阵:

22 5 6 4
32 45 7 9
1 21 43 6
7 5 9 11

我必须分别找到这笔钱:4; 6 + 9; 5 + 7 + 6; 22 + 45 + 43 + 11; 32 + 21 + 9; 1 + 5; 7

After the changes the code become like this:
#include <stdio.h>
#include <cmath>
#include <cstdlib>
#define N 50
void enter_matrix (float m[N][N],int n){
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("Enter %d %d element of the matrix: ",i+1,j+1);
            scanf("%f",&m[i][j]);
        }
    }
}
void show_matrix(float m[N][N],int n){
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%.2f\t",m[i][j]);
        }
        printf("\n");
    }
}

int find_sums(float m[N][N],float sum[100],int n){
    int j=0;
    for(int offset = -n+1; offset < n; ++offset) {
    float sum1 = 0;
    for(int i = 0; i < n-fabs(offset); ++i) {
        if(offset <= 0) {
           sum1 += m[i][i-offset];
        }
        else {
           sum1 += m[i+offset][i];
        }
        sum[j]=sum1;j++;printf("%.2f \n",sum1);
    }
    }
    return j;
}

int find_max(float sum, int j){
    int i,maxn;float *s,max=0;s=&sum;
    for(i=0;i<j;i++){
        if(*(s+1)>max){
            max=*(s+1);
            maxn=i;
        }
    }
    return maxn;
}

int find_min(float sum, int j){
    int i,minn;
    float *s;
    s=&sum;float min=*(s+0);
    for(i=0;i<j;i++){
        if(*(s+1)<min){
            min=*(s+1);
            minn=i;
        }
    }
    return minn;
}

void main(){
    float matrix [N][N], sum[100],*s;
    int  n,j,maxn,minn;
    s=sum;

    do{
        printf("Enter matrix dimension (between 1 and 50):");
        scanf("%d",&n);
    }
    while(n<=0||n>50);
    enter_matrix(matrix,n);
    show_matrix(matrix,n);
    j=find_sums(matrix,sum,n);
    maxn=find_max(sum[100],j);
    minn=find_min(sum[100],j);
    printf("Maximum sum is equal to %.2f, at line %d\n",sum[maxn],maxn+1);
    printf("Minimum sum is equal to %.2f, at line %d\n",sum[minn],minn+1);
}

输出如下:

Enter matrix dimension (between 1 and 50):3
Enter 1 1 element of the matrix: 1
Enter 1 2 element of the matrix: 2
Enter 1 3 element of the matrix: 3
Enter 2 1 element of the matrix: 4
Enter 2 2 element of the matrix: 5
Enter 2 3 element of the matrix: 6
Enter 3 1 element of the matrix: 7
Enter 3 2 element of the matrix: 8
Enter 3 3 element of the matrix: 9
1.00    2.00    3.00
4.00    5.00    6.00
7.00    8.00    9.00
3.00
2.00
8.00
1.00
6.00
15.00
4.00
12.00
7.00
Maximum sum is equal to 3.00, at line 1
Minimum sum is equal to 3.00, at line 1
Press any key to continue

它不仅仅是全线而且还有一些额外的金额。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

未经测试且从头顶开始:

int n;
double A[n][n]

for(int offset = -n+1; offset < n; ++offset) {
    double sum = 0;
    for(int i = 0; i < n-std::abs(offset); ++i) {
        if(offset <= 0) {
           sum += A[i][i-offset];
        else {
           sum += A[i+offset][i];
        }
    }
    std::cout << sum << std::endl;
}

对于负偏移,它打印上部平行对角线的总和,并且对于正偏移,打印下部平行对角线的总和。第一个循环可以简单地并行化,print语句是唯一的关键部分。

答案 1 :(得分:0)

对于那些对角线,它认为z取决于对角线的j = i + z,从 - (高度-1)到(宽度-1)。

这导致以下算法(解决方案数组能够处理负指数 - 你必须通过一些偏移来改变它):

Array<R> diagonalSums (Matrix<R> m)

    initialize Array<R> solution in according size with all entries initialized to zero

    for each cell i,j in m:
        find z so that j = i + z (z = j - i)
        solution[z] += m(i,j)

    return solution

我认为你用你的偏移做了类似的事情,但你试图找到一种方法从z到属于那个z的总和,这只是不必要的混淆,至少当你想要计算所有的总和时无论如何(如果只需要一笔钱,你的方式会更好)。我的方法简单地遍历所有细胞,然后在相应位置添加它。

我使用了一个具有负索引的数组,为了提高可读性,我建议你也这样做,就是创建一个可以做到这一点的类。