我已经为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];
中答案 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^2
,d
次。您应该首先将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;
}