c# - 在 C++ 和 C# 中使用递归求矩阵的行列式

标签 c# c++

使用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/

相关文章:

c# - 用 C# 中的 Reflection 或类似的(没有第 3 方库)替换 Property Getter/Setter

c# - Entity Framework 的独特验证

c++ - 更改静态库的 "Dynamic RTL"设置有什么影响?

c++ - 如何对在测试对象中创建的模拟对象做出期望?

c# - 使用 Microsoft.Reporting.WinForms 动态加载嵌入式资源报表

c# - 一个好的 WCF 客户端设计模式

c++ - 了解 logb() 的工作原理

c++ - WM_SYSCOMMAND SC_MOVE 耗尽鼠标事件并且鼠标弹起未触发

c# - 如何在 HLSL 中启用兼容模式?

c++ - 在 C++ 运行时获取当前操作系统