CC++中简单快速的矩阵向量乘法

CC++中简单快速的矩阵向量乘法,第1张

概述我需要频繁使用matrix_vector_mult(),将矩阵向量相乘,下面是它的实现. 问题:有一个简单的方法,使它显着,至少两倍,更快? 备注:1)矩阵的大小约为300×50.在此期间它不会改变 跑. 2)它必须适用于Windows和Linux. double vectors_dot_prod(const double *x, const double *y, int n){ do 我需要频繁使用matrix_vector_mult(),将矩阵与向量相乘,下面是它的实现.

问题:有一个简单的方法,使它显着,至少两倍,更快?

备注:1)矩阵的大小约为300×50.在此期间它不会改变
跑. 2)它必须适用于Windows和Linux.

double vectors_dot_prod(const double *x,const double *y,int n){    double res = 0.0;    int i;    for (i = 0; i < n; i++)    {        res += x[i] * y[i];    }    return res;}voID matrix_vector_mult(const double **mat,const double *vec,double *result,int rows,int cols){ // in matrix form: result = mat * vec;    int i;    for (i = 0; i < rows; i++)    {        result[i] = vectors_dot_prod(mat[i],vec,cols);    }}
解决方法 这在理论上是一个很好的编译器本身应该做的事情,但是我用我的系统(g 4.6.3)试了一下,通过手工展开4次乘法(大约每个矩阵18us,而不是每个矩阵34us):
double vectors_dot_prod2(const double *x,int n){    double res = 0.0;    int i = 0;    for (; i <= n-4; i+=4)    {        res += (x[i] * y[i] +                x[i+1] * y[i+1] +                x[i+2] * y[i+2] +                x[i+3] * y[i+3]);    }    for (; i < n; i++)    {        res += x[i] * y[i];    }    return res;}

然而,我希望这种微观优化水平的结果在系统之间变化很大.

总结

以上是内存溢出为你收集整理的C/C++中简单快速的矩阵向量乘法全部内容,希望文章能够帮你解决C/C++中简单快速的矩阵向量乘法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存