MathNet-矩阵

  1. 矩阵定义和初始化

常用矩阵初始化函数:

var matrix1 = new DenseMatrix(3);  //3维方阵,初值均为0

var matrix2 = new DenseMatrix(2, 3); //2×3矩阵,初值均为0

var matrix3 = DenseMatrix.Create(2,3,3.0);//2×3矩阵,所有值为3

var matrix4 = DenseMatrix.CreateIdentity(5); //5维单位矩阵

矩阵操作和C#中的数组操作一致,matrix1[m,n]取其m行n列上的值或对其赋值   

MathNet中重载了.ToString()函数,可以直接用matrix.ToString()输出整个数组,大大方便了调试和保存数据。(Console.WriteLine(matrix1);直接这样也可以输出)

也可以利用C#中的double[,]直接创建

Complex [,] d_matrix = new Complex[2, 3];
var matrix5 = DenseMatrix.OfArray(d_matrix);//2×3矩阵

      2.矩阵操作

矩阵操作最常用的莫过于从一个矩阵中取值

var submatrix = matrix.SubMatrix(2, 2, 3, 3); //取从第二行开始的2行,第三列开始的三列 子矩阵

var row = matrix.Row(1, 2, 3); //取从第1行第2列开始的3个行元素

var column = matrix.Column(1, 2, 3); //取从第1列第2行开始的3个列元素

matrix.ColumnEnumerator(2, 4) //取从第2列开始的4列

matrix.RowEnumerator(4, 3)//取从第4行开始的3行

matrix.ToRowWiseArray()

matrix.ToColumnWiseArray() //矩阵变为行向量或者列向量

matrix.Diagonal()//取矩阵的对角线元素向量

var matrix2 = matrix1.ToColumnArrays();
            foreach (var item in matrix2)
            {
                foreach (var item1 in item)
                {
                    Console.WriteLine(item1);
                }
                
            }

//将此矩阵作为列数组的数组返回。返回的数组将独立于此矩阵。将为阵列分配一个新的内存块。

向矩阵中插值

var result1 = matrix1.InsertColumn(3, vector1);
var result2 = matrix1.InsertRow(3, vector1);//将向量vector插入到指定的行/列,原有的行列顺延

matrix1.SetColumn(3, vector1);
matrix1.SetRow(3, vector1); //用vector替换指定的行/列

matrix1.SetSubMatrix(1, 3, 1, 3, DenseMatrix.Identity(3)); //用矩阵替换指定位置的块矩阵

matrix1.SetDiagonal(new Complex[] { 5.0, 4.0, 3.0, 2.0, 1.0 ,0.0}); //替换矩阵的对角线元素

matrixA.Append(matrixB,result); //将matrixB扩展到matrixA的右方,将结果保存在result中

matrixA.Stack(matrixB,result); //将matrixB扩展到matrixA的上方,将结果保存在result中

矩阵转换:   

var permutations = new Permutation(new[] { 0, 1, 2, 4, 3,5 });

matrix1.PermuteRows(permutations);   //互换矩阵的3,4行

var permutations = new Permutation(new[] { 0, 1, 2, 4, 3,5 });

matrix1.PermuteColumns(permutations);   //互换矩阵的3,4列

可以看出,互换是由Permutation中的数字序号决定的。

     3.矩阵运算

matrixA = 3.0 * matrixB    //数乘

matrix1 = matrix1 * vector//矩阵乘向量

matrixC = matrixA + / - / * matrixB   //矩阵加、减、乘

var resultM =matrix1.PointwiseDivide(matrix2); //点除--每个元素单独除

var resultM = matrix1.PointwiseMultiply(matrix2);点乘--每个元素单独除

上述所有运算符都有对应的函数,也可是利用函数进行运算,如“+”可以写成   matrixC = (DenseMatrix)matrixA.Add(matrixB);

或者matrixA.Add(matrixB, matrixC);//等同于matrixC=matrixA+matrixB;

var matrix2 = matrix1.Transpose();         

var matrix2 = matrix1.Inverse();  //求逆和转置

2.求解线性方程组

对于一阶线性方程组

5*x + 2*y - 4*z = -7

3*x - 7*y + 6*z = 38

4*x + 1*y + 5*z = 43

可以如下求解:

var matrix1 = DenseMatrix.OfArray(new Complex[,] { 
{ 5.00, 2.00, -4.00 }, 
{ 3.00, -7.00,6.00 }, 
{ 4.00, 1.00, 5.00 } 
});
var vectorB = new DenseVector(new Complex[] { -7.0, 38.0, 43.0 });

var resultX = matrix1.LU().Solve(vectorB);

或者

var resultX = matrix1.QR().Solve(vectorB);

或者

matrixA.Svd(true).Solve(vectorB, resultX); //矩阵维度必须一致

或者

matrixA.GramSchmidt().Solve(vectorB, resultX);//矩阵维度必须一致

3.矩阵秩、行列式、trace和范数

matrix.Determinant()/Rank()/ConditionNumber()/Trace()   //行列式/秩/条件数/trace

matrix.L1Norm()/L2Norm()/FrobeniusNorm()/InfinityNorm()   //范数

转自:(83条消息) mathnet 使用方法介绍_c914620529的博客-CSDN博客_mathnet

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值