矩阵乘法的常数优化

                    矩阵乘法的常数优化
                      philipsweng

虽然说作为键盘科学家,我们更应该关心程序的时间复杂度。但是一个写的不好的程序可能在实际运行会跟时间复杂度更差的程序差不了多少。我们我们也应该注意程序的常数优化。
对于矩阵乘法来讲。我们实际上可以比较这两种打法。

这里写图片描述
这里写图片描述

实际上第二种打法在绝大多数情况下效率约为第一种的两倍。
这是为什么???
注意到第二个程序的k放在了第二层。
C[i][j] = a[i][k] * b[k][j]
那么我们枚举的顺序就使得a[i]数据顺序枚举以及b[k]顺序枚举。
那么我们数组的寻址速度会增加许多。
然后对于取模操作,我们并不需要每次都取模,因为取模太缓慢。我们可以界定一个范围再取模(慎用。容易溢出)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用行索引、列索引和值来表示稀疏矩阵时,可以使用Eigen库中的SparseMatrix类来进行操作。以下是一个示例代码,其中我们使用了Eigen库和NEON指令集。 ``` #include <Eigen/Sparse> #include <arm_neon.h> void sparse_multiply_neon(const std::vector<int>& rows, const std::vector<int>& cols, const std::vector<double>& vals, float constant, Eigen::VectorXd& result) { const int nnz = vals.size(); const int cols_size = result.size(); // Allocate memory for the result vector result.setZero(); // Loop through the non-zero elements of the sparse matrix for (int i = 0; i < nnz; i++) { // Get the row index, column index, and value of the current element const int row = rows[i]; const int col = cols[i]; const double val = vals[i]; // Calculate the dot product of the current row and the constant float32_t constant_val = constant; float32_t* row_ptr = (float32_t*) &result.coeffRef(col); float32_t* val_ptr = (float32_t*) &val; *row_ptr += (*val_ptr * constant_val); } } ``` 在上述代码中,我们首先获取稀疏矩阵中非零元素的数量和结果向量的大小。接着,我们循环遍历稀疏矩阵中的每一个非零元素。对于每一个非零元素,我们获取该元素的行索引、列索引和值,并使用NEON指令集中的乘法和加法指令,将常数和当前元素的乘积加到结果向量的对应位置上。最后,我们重复以上步骤,直到遍历完整个稀疏矩阵。 需要注意的是,上述代码中使用了NEON指令集中的浮点运算指令,因此需要确保编译器支持NEON指令集,并开启对应的编译选项。此外,在使用稀疏矩阵时,行索引、列索引和值的存储方式可能会影响计算效率。因此,需要根据具体的应用场景选择合适的存储方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值