如何添加矩阵的对角线和半对角线

时间:2019-09-12 17:31:50

标签: c algorithm

我的问题通常是将多项式与链表相乘。我得出的结论是,最好将所有产品存储在矩阵中,然后将它们的对角线和半对角线相加。
例如:给定矩阵4x4

 6,12,18,24   
15,30,48,60
 9,18,27,30
21,42,63,81

我想要作为结果:6 27 57 111 129 93 81

结果来自:

 1. 6
 2. 27 -> 12 + 15
 3. 57 -> 18 + 30 + 9
 4. 111 -> 24 + 48 + 18 + 21
 5. 129 -> 60 + 27 + 42
 6. 93 -> 30 + 63
 7. 81

这是我的函数,接收两个链接列表,然后将两个列表相乘,然后将相等度数的系数相乘并将其传输到nxm矩阵中。

    int* multi(List* L1, List* L2){
    int n, m, i,j;
    List* ret;
    ret = l_new(); //Creates a new list

    //AUX POINTERS
    node* n1;
    node* n2;

    //Asign pointers to the head of the lists
    n1 = L1->first;
    n2 = L2->first;

    n = L1->size;
    m = L2->size;

    double arr[n][m];


    //Fill matrix
    for(i=0; i<L1->size; i++){
        for(j=0; j<L2->size; j++){
            arr[i][j] = n1->coef * n2->coef;
            n2 = n2->next;
            if(n2 == NULL){n2 = L2->first; n1 = n1->next;}
            }
        }

    }

    //FIX RETURN
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您感兴趣的第k对角线中的元素有以下共同点:

row + column = k

总共有n + m - 1个对角线,其中nm是矩阵的尺寸。可以将其转换为以下算法:

coefficients = new list of n + m - 1 elements, initialized to 0
for(int col = 0; col < n; ++col)
    for(int row = 0; row < m; ++row)        
    {
        int k = row + col;
        coefficients[k] += arr[column][row];            
    }