zoukankan      html  css  js  c++  java
  • 求用一维数组表示的矩阵的乘积


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


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

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

    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;
        
    }

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

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

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

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



  • 相关阅读:
    matlab sort函数
    演化计算实数空间变异算子
    SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子
    matlab优化函数fminunc
    mat文件读写
    matlab基本函数 randn,rand,orth
    matlab @(x)构造匿名函数
    java读取写入CSV文件
    递归解决遍历问题
    递归解决全排列问题
  • 原文地址:https://www.cnblogs.com/dancingrain/p/3405246.html
Copyright © 2011-2022 走看看