加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:11:26 所属栏目:百科 来源:网络整理
导读:我需要频繁使用matrix_vector_mult(),将矩阵与向量相乘,下面是它的实现. 问题:有一个简单的方法,使它显着,至少两倍,更快? 备注:1)矩阵的大小约为300×50.在此期间它不会改变 跑. 2)它必须适用于Windows和Linux. double vectors_dot_prod(const double *x,
我需要频繁使用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;
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读