求用一维数组表示的矩阵的乘积
版权所有,转载请注明出处!
写这篇博客并不是为了探讨算法效率的提升,而是尝试以一种更能够让人们读懂的方式进行书写程序,
这里我写了三个程序,分别使用三种编程方式进行书写,希望读者能够找到更加适合自己的方式。
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; }
从上面三个程序可以看出,他们使用的算法是完全一样的,仅仅是在书写的时候采用了不同的技巧,
第一个程序没有采用任何的技巧,直接进行操作,缺点就是容易思路混乱,而且很容易出错。
相比之下,第二和第三段程序采用了宏定义和内联函数来简化思维方式,使得我们能够像操作
二维数组一样对一维数组进行操作。