c++ - C/C++ 中简单快速的矩阵 vector 乘法

标签 c++ c matrix

我需要经常使用 matrix_vector_mult() 将矩阵乘以 vector ,下面是它的实现。

问题:有没有一种简单的方法可以显着加快速度至少两倍?

备注:1)矩阵大小约为300x50。期间不变 跑。 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, const double *y, 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++ 中简单快速的矩阵 vector 乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12289235/

相关文章:

C:链表哈希表填充问题

python - 如果两个矩阵相同,则仅返回一个 bool 语句

opengl - 如何反转3D look_at函数?

c++ - 凭据提供程序的自定义 GUI

c++ - 使用 map<int, Foo> 而不是 vector<Foo> 来避免指针失效

c++ - 使用 boost::accumulators::statistics 查找数组的中位数

c++ - 使用 Visual Studio 2008 在 C++ 中实现逐次逼近算法的问题

c - 如何将 "%99s "克隆到 : fscanf(file, "%d %99s", &id, name) == 2)

c - 关于 C 中 3D 数组的问题

Python - 将稀疏文件读入稀疏矩阵的最佳方法