一、矩阵定义
方法一:
Dim mat1(2, 2) As Double '声明一个两行两列的二维数组
二维数组:Mat1={{1, 4, 7},{2 5 8},{3 6 9}} '数组赋值
Dim mat2(2, 2) As Double
二维数组:Mat2={{1 1 2},{1 3 2},{2 0 3}}
Dim a As DenseMatrix '声明a为稠密矩阵
a = DenseMatrix.OfArray(mat1) '创建矩阵
得:a=[1 4 7; 2 5 8; 3 6 9]
同理可得:b=[1 1 2; 1 3 2; 2 0 3]
Dim resu As DenseVector '声明一个向量
resu = {1, 2, 3}
方法二:
Dim Mat1 = Matrix.Build '创建一个矩阵
Dim a = Mat1.Dense(3, 3, {1, 2, 3, 4, 5, 6, 7, 8, 9}) '矩阵的维度维三行三列
得:a =[1 4 7; 2 5 8; 3 6 9]
二、矩阵操作
Dim a1 = a.At(m, n) '选择矩阵第m+1行第n+1列元素,m和n分别表示矩阵行和列的索引
a.Clear() '设置矩阵的所有元素为零
得:a=[0 0 0; 0 0 0; 0 0 0]
a.ClearColumn(n)'设置第n+1列为零
例如:a.ClearColumn(1)
得:a=[1 0 7; 2 0 8; 3 0 9]
a.ClearColumns(m, n)'设置第m+1、n+1列为零
例如:a.ClearColumn(1, 2)
得:a=[1 0 0; 2 0 0; 3 0 0]
a.ClearRow(n)'设置第n+1行为零
例如:a.ClearRow(1)
得:a=[1 4 7; 0 0 0; 3 6 9]
a.ClearRows(m, n)'设置第m+1、n+1行为零
例如:a.ClearRows(1, 2)
得:a=[1 4 7; 0 0 0; 0 0 0]
a.ClearSubMatrix(m, mCount, n, nCount)'从第m+1行起行数为mCount,第n+1列起列数为nCount的子矩阵为零
例如:a.ClearSubMatrix(0, 2, 0, 2)
得:a=[0 0 7; 0 0 8; 3 6 9]
Dim Re = a.Clone '克隆矩阵
得:Re=[1 4 7; 2 5 8; 3 6 9]
a.CoerceZero(threshold)'矩阵绝对值小于threshold的元素为零
例如:a.CoerceZero(4)
得:a=[0 4 7; 0 5 8; 0 6 9]
Dim Re = a.Column(n) '取矩阵的第n+1列,返回列向量
例如:Re = a.Column(1)
得:Re =[4; 5; 6]
Dim Re = a.Column(n, m, len) '取矩阵第n+1列第m+1行长度为len的列向量
例如:Re = a.Column(2, 1, 2)
得:Re =[8; 9]
a.Column(n, resu) '取得n+1列的列向量复制到resu
例如:a.Column(1, resu)
得:resu=[4; 5; 6]
a.Column(n, m, len, resu) '取矩阵第n+1列第m+1行长度为len的列向量向量复制到resu
例如:a.Column(2, 1, 2, resu)
得:resu=[8; 9; 3]
Dim Re = a.Row(m) '取矩阵的第m+1行
例如:Re = a.Row(1)
得:Re =[2 5 8]
Dim Re = a.Row(m, n, len) '取从第m+1行第n+11列开始的len个行元素
例如:Re = a.Row(1, 1, 2)
得:Re=[5 8]
Dim Re = a.ColumnAbsoluteSums '计算每列的绝对值和
得:Re =[6 15 24]
Dim Re = a.ColumnSums '计算每列的和
得:Re =[6 15 24]
Dim Re = a.ColumnNorms(p) '求每列的p范数,p为1、2和无穷范数(无穷范数参数在vb中参数书写暂时没找到)
例如:Re = a.ColumnNorms(1)
得:Re=[6 15 24]
例如:Re = a.ColumnNorms(2)
得:Re=[3.742 8.775 13.928]
Dim Re = a.RowAbsoluteSums '计算矩阵每行的绝对值和
得:Re =[12; 15; 18]
Dim Re = a.RowSums '计算每行的和
得:Re=[12; 15; 18]
Dim Re = a.RowNorms(p) '求每行的p范数,p为1、2、无穷范数
例如:Re = a.RowNorms(2)
得:Re=[8.12; 9.64; 11.22]
Dim Re = a.ConditionNumber() '计算矩阵的条件数,条件数通过奇异值分解计算的
得:Re =30394691695055128.0
a.CopyTo(b) '将a矩阵复制到b矩阵
得:b=[1 4 7; 2 5 8; 3 6 9]
Dim Re = a.DiagonalStack(b) '对角堆栈,b在a的右下角,其余用零值补充,返回的矩阵行和列等于a和b两矩阵行和列数之和
得:Re = [1 4 7 0 0 0;2 5 6 0 0 0;3 6 9 0 0 0;0 0 0 1 1 2;0 0 0 1 3 2;0 0 0 2 0 3]
Dim Re = a.Enumerate() '枚举型,遍历矩阵所有值,类型为double()型
得:Re ={1 2 3 4 5 6 7 8 9}
Dim Re = a.Equals(b) '判a和b是否相等,返回bool型
得:Re =False
Dim Re = a.FrobeniusNorm() '计算矩阵每个元素的平方和,再求平方根
得:Re =16.882
Dim Re = a.GetHashCode() '计算哈希码用于哈希算法
得:Re =1424130831
Dim Re = a.GetType() '返回类型
得:Re =’DenseMatrix’
Dim Re = a.LowerTriangle() '下三角
得:Re =[1 0 0; 2 5 0; 3 6 9]
Dim Re = a.Negate() '矩阵每个元素前添加负号
得:Re =[-1 -4 -7; -2 -5 -8; -3 -6 -9]
Dim Re = a.RemoveColumn(n) '删除第n+1列
例如:Re = a.RemoveColumn(1)
得:Re = [1 2 3; 7 8 9]
Dim Re = a.RemoveRow(m) '删除第m+1行
例如:Re = a.RemoveRow(1)
得:Re =[1 4 7;3 6 9]
Dim Re = a.ToArray() '矩阵转换为二维数组
得:Re ={{1, 4, 7},{2 5 8},{3 6 9}}
Dim Re = a.ToColumnArrays() '以列数组的形式返回矩阵
得:Re ={{1; 2; 3},{4; 5; 6},{7; 8; 9}}
Dim Re = a.ToColumnMajorArray() '以数组的形式返回矩阵的元素,数据按列排列
得:Re ={1 2 3 4 5 6 7 8 9}
Dim Re = a.ToMatrixString '返回一个字符串,该字符串汇总此矩阵的内容
得:Re =”1 4 7 2 5 8 3 6 9”
Dim Re = a.Append(b) '矩阵连接起来
得:Re =[1 4 7 1 1 2; 2 5 8 1 3 2; 3 6 9 2 0 3]
Dim Re = a.ToString() '返回一个汇总此矩阵的字符串
得:Re =”DenseMatrix 3x3-Double 1 4 7; 2 5 8; 3 6 9”
Dim Re = a.ToTypeString() '返回一个字符串,该字符串描述该矩阵的类型、尺寸和形状
得:Re =“DenseMatrix 3x3-Double”
Dim Re = a.ToArray() '以多维数组的形式返回这个矩阵
得:Re ={{1, 4, 7},{2 5 8},{3 6 9}}
Dim Re = a.ColumnCount '列数
得:Re =3
Dim Re = a.RowCount '行数
得:Re =3
Dim Re = a.SubMatrix(m, m_num, n, n_num) '取从第m+1行开始的m_num行,第n+1列开始的n_num列 子矩阵
例如:Re = a.SubMatrix(1, 2, 1, 2)
得:Re =[5 8; 6 9]
Dim Re = a.Diagonal() '取矩阵的对角线元素向量
得:Re =[1 5 9]
Dim vec As DenseVector
vec = {1, 2, 3}
Dim Re = a.InsertColumn(n, vec) '将向量vector插入到指定的n+1列,原有的行列顺延
例如:Re = a.InsertColumn(3, vec)
得:Re =[1 4 7 1; 2 5 8 2; 3 6 9 3]
Dim Re = a.InsertRow(m, vec) '将向量vector插入到指定的m+1行,原有的行列顺延
例如:Re = a.InsertRow(3, vec)
得:Re =[1 4 7; 2 5 8; 3 6 9; 1 2 3]
a.SetColumn(n, vector) '用vector替换指定的n+1列
例如:a.SetColumn(2, vector)
得:a=[1 4 1; 2 5 2; 3 6 3]
a.SetRow(m, vector) '用vector替换指定的m+1行
例如:a.SetRow(2, vector)
得:a=[1 4 7; 2 5 8; 1 2 3]
a.SetDiagonal(vec) '替换矩阵的对角线元素
得:a=[1 4 7; 2 2 8; 3 6 3]
Dim re(,) As Double
re = {{1, 1}, {2, 2}}
Dim rep As DenseMatrix
rep = DenseMatrix.OfArray(re)
a.SetSubMatrix(m, m_num, n, n_num, rep) '用矩阵替换第m+1行起m_num行,第n+1列起n_num指定位置的块矩阵
例如:a.SetSubMatrix(1, 2, 1, 2, rep)
得:a=[1 4 7; 2 1 1; 3 2 2]
三、矩阵运算
Dim Re = a.Add(b) '矩阵加法
得:Re =[2 5 9; 3 8 10; 5 6 12]
Dim Re = a.Subtract(b) '矩阵减法
得:Re =[0 3 5; 1 2 6; 1 6 6]
Dim Re = a * b '矩阵相乘
得:Re = [19 13 31; 23 17 38; 27 21 45]
Dim Re = a.PointwiseMultiply(b) '矩阵点乘
得:Re =[1 4 14; 2 15 16; 6 0 27]
Dim Re = a * 2 '矩阵数乘
得:Re =[2 8 14; 4 10 16; 6 12 18]
Dim Re = a.LeftMultiply(vec) '向量乘矩阵
得:Re =[14 32 50]
Dim Re = vec * a
得:Re =[14 32 50]
Dim Re = a * vec '矩阵乘向量
得:Re =[30; 36; 42]
Dim Re = a.PointwiseDivide(b) '矩阵点除
得:Re =[1 4 3.5; 2 1.667 4; 1.5 INF 3]
Dim Re = a.Inverse '矩阵求逆
得:Re =[=4.5 1.5 2; -0.5 0.5 0; 3 -1 -1]
Dim Re = a.Transpose '矩阵转置
得:Re =[1 2 3; 4 5 6; 7 8 9]
Dim Re = a.Trace '矩阵的迹
得:Re =15
Dim Re = a.Rank '矩阵的秩
得:Re =2
Dim Re = a.L1Norm '矩阵的1范数
得:Re =24
Dim Re = a.L2Norm '矩阵的2范数
得:Re =16.8481
Dim Re = a.InfinityNorm '矩阵的无穷范数
得:Re =18
Dim Re = b.Determinant '矩阵的行列式
得:Re =-1.9999999999999996
Dim Re = a.Svd(True) '奇异值分解
得:Re.S=[16.848 1.0684 0]
Re.VT=[-0.2148 -0.5206 -0.8263; -0.8872 -0.2496 0.3879; 0.4082 -0.8165 0.4082]
Re.U=[-0.4797 0.7767 0.4082; -0.5724 0.0757 -0.8165; -0.6651 -0.6253 0.4082]
Dim Re = a.Evd() '特征分解
得:Re.EigenValues=[16.1168 -1.1168 -5.1063]
Re.EigenVectors=[0.4645 0.9179 0.4082; 0.5708 0.2490 -0.8165; 0.6770 -0.4199 0.4082]
Dim Re = a.TransposeAndMultiply(b) '将矩阵a乘以矩阵b的转置
得:Re =[19 27 23; 23 33 28; 27 39 33]
Dim Re = a.TransposeThisAndMultiply(vec)'将这个矩阵的转置乘以向量
得:Re =[14; 32; 50]
Dim Re = a.TransposeThisAndMultiply(b) '将矩阵a的转置乘以矩阵b
得:Re = [9 7 15; 21 19 36; 33 31 57]