- `Vector`
-
- [使用 `Build.Dense` 创建列向量:](#使用
Build.Dense
创建列向量:) - 列向量转行向量(行矩阵):
- [使用 `DenseOfArray` 方法:](#使用
DenseOfArray
方法:) - [使用 `PointwiseMultiply` 进行向量元素级乘法:](#使用
PointwiseMultiply
进行向量元素级乘法:) - 计算向量的点积(内积):
- 访问向量的特定元素:
- 遍历向量中的所有元素:
- 输出向量:
- [使用 `Build.Dense` 创建列向量:](#使用
- `Matrix`
-
- 创建矩阵:
- 矩阵属性访问:
- 矩阵元素访问和赋值:
- 矩阵运算:
- 矩阵分解和求解:
- 读写矩阵:
- 矩阵的转置:
- [逐点乘法 `PointwiseMultiply`](#逐点乘法
PointwiseMultiply
) - `SetColumn`
- [`TransposeThisAndMultiply` `D'*D`](#
TransposeThisAndMultiply
D'*D
) - [`Inverse` D^(-1)](#
Inverse
D^(-1)) - 矩阵的打印和字符串表示:
Vector
在 MathNet.Numerics
中,Vector<T>
是表示向量的类。Vector<T>
可以是列向量或行向量,具体取决于你如何创建它以及如何使用它。以下是一些创建和使用 Vector<T>
的常见方法:
使用 Build.Dense
创建列向量:
csharp
var vector =
Vector<double>.Build.Dense(new double[] {1, 2, 3});
列向量转行向量(行矩阵):
csharp
var b = Vector<double>.Build.Dense(5, 0);
Matrix<double> rowVector = b.ToRowMatrix();
使用 DenseOfArray
方法:
csharp
var vectorFromArray =
Vector<double>.Build.DenseOfArray(
new double[] { 1, 2, 3 }
);
使用 PointwiseMultiply
进行向量元素级乘法:
csharp
var vector1 =
Vector<double>.Build.Dense(
new double[] {1, 2, 3}
);
var vector2 =
Vector<double>.Build.Dense(
new double[] {4, 5, 6}
);
var product = vector1.PointwiseMultiply(vector2);
Console.WriteLine(product);
csharp
DenseVector 3-Double
4
10
18
计算向量的点积(内积):
csharp
var vector1 =
Vector<double>.Build.Dense(
new double[] { 1, 2, 3 }
);
var vector2 =
Vector<double>.Build.Dense(
new double[] { 4, 5, 6 }
);
var dotProduct = vector1.DotProduct(vector2);
Console.WriteLine(dotProduct);
csharp
32
获取向量的转置(对于列向量,转置将返回行向量,反之亦然):
csharp
// 创建一个列向量
var vector =
Matrix<double>.Build.DenseOfArray(
new double[,] { { 1}, { 2}, { 3} }
);
// 获取列向量的转置,即行向量
var transposedVector = vector.Transpose();
Console.WriteLine(transposedVector);
csharp
DenseMatrix 1x3-Double
1 2 3
访问向量的特定元素:
csharp
var vector3 =
Vector<double>.Build.Dense(
new double[] { 1, 2, 3 }
);
double firstElement = vector3[0];
Console.WriteLine(firstElement);设置向量的特定元素:
csharp
1
遍历向量中的所有元素:
csharp
var vector3 =
Vector<double>.Build.Dense(
new double[] { 1, 2, 3 }
);
foreach (var element in vector3) {
Console.WriteLine(element);
}
csharp
1
2
3
输出向量:
csharp
var vector3 =
Vector<double>.Build.Dense(
new double[] { 1, 2, 3 }
);
Console.WriteLine(vector3);
csharp
DenseVector 3-Double
1
2
3
Matrix
在 C#
中,使用 MathNet.Numerics
库来处理矩阵是一个高效且功能丰富的选择。以下是一些关于如何在 C#
中使用 MathNet.Numerics
库创建和操作矩阵的基本步骤:
创建矩阵:
csharp
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double;
using System;
namespace forCode20192 {
class Program {
static void Main(string[] args) {
var D = Matrix<double>.Build.Dense(2, 9, 1);
Console.WriteLine(D);
Console.ReadKey();
}
}
}
csharp
DenseMatrix 2x9-Double
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
矩阵属性访问:
可以访问矩阵的行数和列数。
csharp
int rowCount = matrix.RowCount;
int columnCount = matrix.ColumnCount;
矩阵元素访问和赋值:
可以通过索引访问和修改矩阵中的元素。
csharp
double element = matrix[0, 1]; // 获取第 1 行第 2 列的元素
matrix[0, 1] = 10; // 设置第 1 行第 2 列的元素为 10
矩阵运算:
MathNet.Numerics
提供了矩阵加法、减法、数乘、矩阵乘法等基本矩阵运算。
csharp
var a = Matrix<double>.Build.Dense(2, 2, 2);
a[1, 1] = 0;
var b = Matrix<double>.Build.DenseOfArray(
new double[,] { {1, 0}, {0, 1} }
);
Console.WriteLine(a*b);
csharp
DenseMatrix 2x2-Double
2 2
2 0
矩阵分解和求解:
MathNet.Numerics
支持多种矩阵分解方法,如 LU
分解、QR
分解等,并可以用来求解线性方程组。
csharp
var lu = matrix.LU();
var solution = lu.Solve(vector); // 假设 vector 是已知的向量
读写矩阵:
MathNet.Numerics
支持从文件中读取矩阵,或将矩阵保存到文件,支持的格式包括 CSV
、MAT
等。
csharp
var matrixFromFile = Matrix<double>.Read(
"path/to/matrix.csv", hasHeaders: true
);
matrix.Write("path/to/matrix.csv", DelimitedWriter.Write);
矩阵的转置:
可以使用 Transpose
方法获取矩阵的转置。
csharp
var transposedMatrix = matrix.Transpose();
逐点乘法 PointwiseMultiply
在 MathNet.Numerics
中,PointwiseMultiply
方法用于对两个向量进行逐点乘法(也称为元素乘法或哈达玛乘法)。逐点乘法是指将两个向量的对应元素相乘,生成一个新的向量,其中新向量的每个元素都是原始向量对应元素的乘积。
csharp
Vector<double> vectorA = Vector<double>.Build.Dense(
new double[] { 1.0, 2.0, 3.0 }
);
Vector<double> vectorB = Vector<double>.Build.Dense(
new double[] { 4.0, 5.0, 6.0 }
);
// 执行逐点乘法
Vector<double> result = vectorA.PointwiseMultiply(vectorB);
// 输出结果向量
Console.WriteLine(result);
csharp
DenseVector 3-Double
4
10
18
SetColumn
在 MathNet.Numerics
中,SetColumn
方法用于设置矩阵中的一个列向量。这个方法属于 Matrix<T>
类,其中 T
可以是 double
、complex
或其他数值类型。通过 SetColumn
方法,你可以将一个向量(作为参数传递)设置为矩阵的指定列。
csharp
// 创建一个 3x3 的矩阵
Matrix<double> matrix = Matrix<double>.Build.Dense(3, 3);
// 创建一个列向量
Vector<double> columnVector = Vector<double>.Build.Dense(
new double[] { 1.0, 2.0, 3.0 }
);
// 将列向量设置为矩阵的第二列
matrix.SetColumn(1, columnVector);
// 输出修改后的矩阵
Console.WriteLine(matrix);
csharp
DenseMatrix 3x3-Double
0 1 0
0 2 0
0 3 0
TransposeThisAndMultiply
D'*D
在 MathNet.Numerics
中,TransposeThisAndMultiply
方法是一个高效的运算符,用于执行矩阵的转置-乘法操作。这个方法首先转置调用它的矩阵,然后将转置后的矩阵与另一个矩阵相乘。这种方法在某些情况下比先显式转置矩阵然后进行乘法更高效,因为它可以避免创建转置矩阵的副本。
csharp
// 创建两个矩阵
Matrix<double> matrixA = Matrix<double>.Build.DenseOfArray(
new double[,] { { 1, 2, 3 }, { 4, 5, 6 } }
);
Matrix<double> matrixB = Matrix<double>.Build.DenseOfArray(
new double[,] { { 7, 8 }, { 9, 10 } }
);
// 使用 TransposeThisAndMultiply 方法
Matrix<double> result = matrixA.TransposeThisAndMultiply(matrixB);
// 输出结果矩阵
Console.WriteLine(result);
csharp
DenseMatrix 3x2-Double
43 48
59 66
75 84
Inverse
D^(-1)
求可逆矩阵的逆
csharp
// 创建一个方阵
Matrix<double> matrix = Matrix<double>.Build.DenseOfArray(
new double[,] { { 1, 2 }, { 3, 4 } }
);
// 计算矩阵的逆
Matrix<double> inverseMatrix = matrix.Inverse();
// 输出逆矩阵
Console.WriteLine(inverseMatrix);
csharp
DenseMatrix 2x2-Double
-2 1
1.5 -0.5
矩阵的打印和字符串表示:
MathNet.Numerics
提供了方便的 ToString
方法,用于打印矩阵的字符串表示。
csharp
Console.WriteLine(matrix);
请注意,上述代码示例中的 matrix
和 vector
是 Matrix<T>
和 Vector<T>
类型的对象,T
通常是 double
、float
、Complex
或 Complex32
中的一种。MathNet.Numerics
是一个开源的数值计算库,专为 .NET
和 Mono
设计,提供了广泛的数值计算方法和算法。