写一个函数来计算C中(nxn)矩阵的n次幂

时间:2015-04-09 19:19:33

标签: c arrays multidimensional-array

我已经为2个矩阵算法的乘法添加了一个for,但似乎它不起作用。我需要在不使用指针,内存分配和仅使用基本指令的情况下执行此任务(for,while,...)< / p>

void product(double a[][20],double c[][20],int n,int d)
{
    int i, j, k, l;

    for(l = 1;l <= d; ++l) {
        for(i = 0; i < n; i++) {
            for(j = 0; j < n; j++) {
                c[i][j] = 0;
                for(k = 0; k < n; k++) {
                    c[i][j] += a[i][k]*a[k][j];
                }
             }
         }
     }
}

此函数应计算A ^ d并将其存储在c [] [20];

3 个答案:

答案 0 :(得分:1)

您的代码尝试计算A ^(2 ^ d),但它计算A ^ 2 d次。

您不能进行矩阵乘法,因为在计算结果时,您将覆盖值。因此,您需要一个副本的临时空间(除非d = 0,1或2)。

将C设置为单位矩阵,如果d = 0则返回。否则设置C = A的副本,分配矩阵B,然后对于l = 1到d - 1将C复制到B,让C = A * B ..解除分配B.

答案 1 :(得分:0)

您的代码正在计算A^2d次。您应该首先将C初始化为单位矩阵,除了在它所在的对角线上之外全部为0。然后循环d乘以C乘以A

答案 2 :(得分:0)

对于此算法的更快版本,乘以2的幂,使用整数数学来表示提高到n次幂的想法:

    unsigned int n;   /* unsigned to prevent issues with right shift */
    b = a;            /* a, b, c, t are actually matrices */
    c = 1;            /* identity matrix */
    t;                /* temp matrix */
    while(n){
        if(n&1){      /* if (n&1), c *= b */
            t = c*b;
            c = t;
        }
        t = b*b;      /* b = b^2 */
        b = t;
        n >>= 1;
    }