矩阵加法和乘法算法

时间:2015-02-24 05:05:31

标签: algorithm matrix time big-o matrix-multiplication

令m,n为整数,使得0 <= m,n <1。 N.

定义:

  Algorithm A: Computes m + n in time O(A(N))

  Algorithm B: Computes m*n in time O(B(N))

  Algorithm C: Computes m mod n in time O(C(N))

使用算法A,B和C的任何组合描述了用于N×N矩阵加法和矩阵乘法的算法,其具有Z / NZ中的条目。同时指出算法的运行时间大O表示法。

尝试解决方案:

在Z / NZ中添加N X N: 令A和B为Z / NZ中的NXN矩阵,其中条目a_ {ij}和b_ {ij}使得i,j在{0,1,...,N}中,其中i表示行,j表示列在矩阵中。另外,让A + B = C

Step 1. Run Algorithm A to get a_{ij} + b_{ij} = c_{ij}   in time O(A(N))

Step 2. Run Algorithm C to get c_{ij} mod N in time O(C(N))

对{0,1,...,N}中的所有i,j重复步骤1和2。

这意味着我们必须重复1,2 N ^ 2次的步骤。所以总运行时间由

估算
 N^2[ O(A(N)) + O(C(N)) ] = O(N^2 A(N)) + O(N^2 C(N)) = O(|N^2 A(N)| + |(N^2 C(N)|).

对于乘法算法,我刚刚用算法B替换了步骤1,并且总运行时间为O(|N^2 B(N)| + |(N^2 C(N)|),如上所述。

请告诉我是否正确接近此问题,尤其是使用big-O表示法。

感谢。

2 个答案:

答案 0 :(得分:0)

matrix multiplication的算法是错误的,并且会产生错误的答案,因为A*B_{i,j} != A_{i,j} * B_{i,j}(除了像零矩阵这样的特殊情况外)

我认为问题的目标不是实现有效的矩阵乘法,因为它是一个很难且仍在研究的问题,所以我将回答矩阵乘法的天真实现。

对于任何指数i,j:

(AB)_{i,j} = Sum( A_{i,k} * B_{k,j}) = 
           = A_{i,1} * B_{1,j} + A_{i,2} * B_{2,j} + ... + A_{i,k} * B_{k,j} + ... + A_{i,n} * B_{n,j} 

正如您所看到的,对于每对i,j,有n次乘法和n-1次加法ץ关于C的调用次数 - 这取决于您是否需要调用它在每次添加之后,或者在完成后只执行一次(这实际上取决于您需要代表每个数字的位数),因此对于每对i,j - 您可能需要它从一次到{{1调用。

这给出了我们的总复杂度(假设每个(i,j)对的2n-1 modolus,如果需要更少,如上所述 - 相应调整):

2n-1

作为旁注,显示您的算法的良好健全性检查确实是错误的 - 证明矩阵乘法不能比O(n^3*A + n^3*B + n^3*C) Raz,2002)更好,并且最佳当前实现是{ {1}}

答案 1 :(得分:0)

#include <stdio.h>

void main() 
{
  int i, j;
  int a[3][3], b[3][3];

  printf("enter elements for 1 matrix\n");

  for (i = 0; i < 3; i++) 
  {
    for (j = 0; j < 3; j++) 
    {
      scanf("%d", &a[i][j]);
    }
    printf("\n");
  }

  printf("enter elements for 2 matrix\n");

  for (i = 0; i < 3; i++) 
  {
    for (j = 0; j < 3; j++) 
    {
      scanf("%d", &b[i][j]);
    }
    printf("\n");
  }

  printf("the sum of matrix 1 and 2\n");

  for (i = 0; i < 3; i++) 
  {
    for (j = 0; j < 3; j++) 
    {
        printf("%d\n", (a[i][j] + b[i][j]));
    }
    printf("\n");
  }
}