求用一维数组表示的矩阵的乘积


版权所有,转载请注明出处!


写这篇博客并不是为了探讨算法效率的提升,而是尝试以一种更能够让人们读懂的方式进行书写程序,

这里我写了三个程序,分别使用三种编程方式进行书写,希望读者能够找到更加适合自己的方式。

1.直接按照一维数组的习惯操作:

#include <iostream>
#define N 3
using namespace std;
int main (int argc, const char * argv[])
{
    int A[] = {1,2,3,4,5,6,7,8,9};
    int B[] = {7,6,5,1,2,3,2,8,7};
    int C[9]= {0};
    memset(C, 0, sizeof(C));
    for(int i =0; i < N; i ++)
        for(int j = 0; j < N; j ++)
        {
            int ele = 0;
            for(int k =0; k < N; k ++)
            {
                ele += A[i*N + k]*B[k*N + j];
            }
            C[i*N +j] = ele;
        }
    
    for(int p =0; p < N; p++){
        for(int q = 0; q < N; q ++)
        {
            cout << C[p*N +q]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

2.使用宏定义简化思维方式:

#include <iostream>
#define N 3
#define ELEMENT(A,i,j) A[i*N + j] 
using namespace std;
int main (int argc, const char * argv[])
{
    int A[] = {1,2,3,4,5,6,7,8,9};
    int B[] = {7,6,5,1,2,3,2,8,7};
    int C[9]= {0};
    memset(C, 0, sizeof(C));
    for(int i =0; i < N; i ++)
        for(int j = 0; j < N; j ++)
        {
            int ele = 0;
            for(int k =0; k < N; k ++)
            {
              
                ele += ELEMENT(A, i , k)*ELEMENT(B , k, j );
            }
            
            ELEMENT(C , i, j) = ele;
        }
    
    for(int p =0; p < N; p++){
        for(int q = 0; q < N; q ++)
        {
            cout << ELEMENT(C, p , q )<<" ";
        }
        cout<<endl;
    }

    return 0;
    
}

3.使用内联函数简化思维方式:

#include <iostream>
#define N 3
using namespace std;

inline int element(int *A, size_t i, size_t j)//实现下标操作
{
    return A[i*N + j];
}
inline void setElenent(int *A, size_t i, size_t j, int element)//设置指定的元素
{
    A[i*N + j] = element;
}

int main (int argc, const char * argv[])
{
    int A[] = {1,2,3,4,5,6,7,8,9};
    int B[] = {7,6,5,1,2,3,2,8,7};
    int C[9]= {0};
    for(int i =0; i < N; i ++)
        for(int j = 0; j < N; j ++)
        {
            int ele = 0;
            for(int k =0; k < N; k ++)
            {
                ele += element(A, i, k)*element(B , k, j);
            }
            setElenent(C,i,j,ele);
        }
    
    for(int p =0; p < N; p++){
        for(int q = 0; q < N; q ++)
        {
            cout << element(C, p , q )<<" ";
        }
        cout<<endl;
    }
    
    return 0;
    
}

从上面三个程序可以看出,他们使用的算法是完全一样的,仅仅是在书写的时候采用了不同的技巧,

第一个程序没有采用任何的技巧,直接进行操作,缺点就是容易思路混乱,而且很容易出错。

相比之下,第二和第三段程序采用了宏定义和内联函数来简化思维方式,使得我们能够像操作

二维数组一样对一维数组进行操作。



posted @ 2012-08-07 11:02  dancingrain  阅读(604)  评论(0编辑  收藏  举报