我的问题通常是将多项式与链表相乘。我得出的结论是,最好将所有产品存储在矩阵中,然后将它们的对角线和半对角线相加。
例如:给定矩阵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;
}
答案 0 :(得分:1)
您感兴趣的第k
对角线中的元素有以下共同点:
row + column = k
总共有n + m - 1
个对角线,其中n
和m
是矩阵的尺寸。可以将其转换为以下算法:
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];
}