Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一种计算向量子集的优化方法_C++_Algorithm_Vector_Linear Algebra - Fatal编程技术网

C++ 一种计算向量子集的优化方法

C++ 一种计算向量子集的优化方法,c++,algorithm,vector,linear-algebra,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]

好的,我正在实现一个算法,计算由以下位置给出的
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)
{
   //....

}
模板
浮点数据(标准::矢量数据)
{
//....
}
但是,我不知道这是否是实现这一点的方法,我如何才能像建议的方法一样访问这一方法的不同元素?

如果您专门处理3 x 3矩阵,您可以硬编码类似的内容

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]);
}
我希望第二个函数与您已有的函数非常接近


因为你需要所有这些数字来计算行列式,因此必须至少访问每一个数字一次,我怀疑还有比这更快的吗。行列式在计算上并不完美。比蛮力方法(Sarrus的规则基本上是)要求你先变换矩阵,这会比仅仅做上面的操作消耗更多的时间。硬编码——这是Sarrus的全部规则——并不漂亮,但如果你不必为n>3做任何行列式,我认为这是最快的方法。

我读对了吗,你要求的是一种平滑的方法来完成“从矩阵中划掉行和列”这是在开发行列式时完成的?您可能希望创建自己的迭代器来跳过适当的行或列。在任何情况下,它都很难比为3x3硬编码更有效(从性能角度来看),因为这样可以很容易地放入缓存并避免任何浪费的操作。@G.Bach基本上是的。听起来很容易。。我把这件事复杂化了吗?好吧,你可以生成矩阵的副本,并从副本中删除所需的条目。删除该行将从副本中删除包含该行内容的向量,删除该列将删除每个剩余行中的相应条目——或者更好的做法是,在复制矩阵时顺便执行所有操作。它可以写得非常优雅,但我不知道计算行列式最有效的方法是什么。如果你只做3x3矩阵,你可以像我一样硬编码.@G.Bach。传入4个值是没有效率的,我只需要每次跳过一行。我要去看看。但是在最坏的情况下,这个算法总是在<代码> 3x3< /Cord>矩阵上工作,所以硬编码它可能不是世界上最坏的事情吗?它也会很好用有效的C++代码(例如,不是<代码>浮点[][A]代码/代码> @ CalthHth. -阿尔夫,我不太习惯C++,我希望它是有效的。我想是现在。