计算向量矢量子集的最佳方法

时间:2014-06-08 12:32:29

标签: c++ algorithm vector linear-algebra

好的,所以我正在实施一个算法来计算以下展示位置的3x3矩阵的行列式:

A = [0,0 0,1 0,2 
     1,0 1,1 1,2 
     2,0 2,1 2,2]

目前,算法是这样的:

float a1 = A[0][0]; 
float calula1 = (A[1][1] * A[2][2]) - (A[2][1] * A[1][2]) 

然后我们转到下一列,所以它将是:

float a2 = A[0][1];
float calcula2 = (A[1][0] * A[2][2]) - (A[2][0] * A[1][2]); 

就像这样,再移动一个。现在,这个,个人效率不高,我已经实现了一个可以计算2x2矩阵的行列式的函数,这基本上就是我为这些计算所做的事情。

因此,我的问题是,有没有一种最佳方式可以做到这一点?我想过有一个函数的想法,它调用一个模板(X,Y)来表示3x3矩阵的特定块的起始和结束位置:

template<typename X, Y> 
float det(std::vector<Vector> data)
{
   //....

}

但是,我不知道这是否是这样做的方式,我怎么能像提议的方法那样访问这个的不同元素?

1 个答案:

答案 0 :(得分:1)

如果你只处理3 x 3矩阵,你可以像这样对rule of Sarrus进行硬编码。

float det_3_x_3(float** A) {
    return A[0][0]*A[1][1]*A[2][2] + A[0][1]*A[1][2]*A[2][0]
           + A[0][2]*A[1][0]*A[2][1] - A[2][0]*A[1][1]*A[0][2]
           - A[2][1]*A[1][2]*A[0][0] - A[2][2]*A[1][0]*A[0][1];
}

如果你想保存3次乘法,你可以去

float det_3_x_3(float** A) {
    return A[0][0] * (A[1][1]*A[2][2] - A[2][1]*A[1][2])
           + A[0][1] * (A[1][2]*A[2][0] - A[2][2]*A[1][0])
           + A[0][2] * (A[1][0]*A[2][1] - A[2][0]*A[1][1]);
}

我希望第二个功能与你已经完全接近。

由于你需要所有这些数字来计算行列式并因此必须至少访问它们中的每一个,我怀疑有什么比这更快。决定因素在计算上并不完全漂亮。 {4}比蛮力方法(Sarrus的规则基本上是)要求你先对矩阵进行变换,并且为3 x 3矩阵节省的时间比上面那样多。对Faster algorithms进行硬编码 - 这就是Sarrus规则所要求的 - 并不漂亮,但我认为如果你不必为n&gt;做任何决定因素,这是最快的方法。 3。