【发布时间】:2011-01-11 10:29:03
【问题描述】:
问这个问题的背景是我正在求解一个线性方程组(Ax=b),其中 A 是一个矩阵(通常尺寸小于 100x100),x 和 b 是向量。我使用的是直接方法,这意味着我首先反转 A,然后通过 x=A^(-1)b 找到解决方案。这一步在一个迭代过程中重复,直到收敛。
我现在使用矩阵库 (MTL4) 的方式:
对于每次迭代,我将 A(值)的所有系数复制到矩阵对象中,然后反转。这是最简单、最安全的选择。
改用指针数组:
对于我的特殊情况, A 的系数恰好在每次迭代之间更新。这些系数存储在不同的变量中(有些是数组,有些不是)。如果我将 A 设置为包含指向这些系数变量的指针的数组,然后就地反转 A,是否有可能提高性能?
最后一个选项的好处是,一旦我在第一次迭代之前在 A 中设置了指针,我就不需要在连续迭代之间复制任何值。在 A 中指向的值将在迭代之间自动更新。
所以在我看来,性能问题归结为:
- 矩阵求逆过程所用的时间大致相同,假设取消引用指针并不昂贵。
- 指针数组不需要用于包含值的矩阵 A 的额外内存。
- 指针数组选项不必在每次迭代之间复制 A 的所有 NxN 值。
- 指向指针数组选项的值通常不在内存中排序。希望所有值在内存中都相对接近,但 *A[0][1] 通常不在 *A[0][0] 等旁边。
对此有什么意见吗?最后一句话是否会对性能产生负面影响,从而权衡积极的性能影响?
【问题讨论】:
标签: c++ performance pointers matrix inversion