使用C++计算矩阵的行列式:
int pw(int a){
if(a%2==0)return 1;else return -1;
}
float det(vector<vector<float> > &arr, int rows){
vector<vector<float> > arr2;
float dett=0,hk;
if(rows==2){
dett= (arr[0][0]*arr[1][1]-arr[0][1]*arr[1][0]);
} else {
for(int i=0;i<rows;i++){
hk=arr[0][i];arr2=arr;
arr2.erase(arr2.begin());
for(int k=0;k<rows-1;k++)arr2[k].erase(arr2[k].begin()+i);
dett=dett+pw(i)*hk*det(arr2,rows-1);
}
}
return dett;
}
C# 中的相同函数有一个问题:当循环到达 i=1 时,arr
在 c++ 和 c# 中不相同。
int pw(int a)
{
if (a % 2 == 0) return 1; else return -1;
}
double det(List<List<double>> arr)
{
int rows = arr.Count;
List<List<double>> arr2;
double dett = 0, hk;
if (rows == 2)
{
dett = (arr.First().First() * arr.Last().Last() - arr.First().Last() * arr.Last().First());
}
else
{
for (int i = 0; i < arr.Count; i++)
{
hk = arr[0][i]; arr2 = arr;
arr2.RemoveAt(0);
foreach (List<double> k in arr2) k.RemoveAt(i);
dett = dett + pw(i) * hk * det(arr2);
}
}
return dett;
}
最佳答案
And I check when the loop reach i=1, "arr" isn't the same when Recursion start.
是的,那是因为您正在使用 arr2 = arr
,它不复制列表,arr2
仍然是对arr
的引用.你能做的是arr2 = new List<List<double>>(arr);
使用 arr
的元素创建一个新列表.
编辑
要在列表中复制列表,您可以这样做。
arr2 = new List<List<double>>(arr.Select(x => new List<double>(x)));
关于c# - 在 C++ 和 C# 中使用递归求矩阵的行列式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47439420/