1、double[][]二维数组转成Matrix—其实根本不用这么麻烦(txt文件-double[][]—Matrix)

  1. private Matrix GetMatrix(DataTable dt)
  2. {
  3. List<double[]> datas = new List<double[]>();
  4. foreach (DataRow dr in dt.Rows)
  5. {
  6. double[] a = new double[4] { (double)dr[0], (double)dr[1], (double)dr[2], (double)dr[3] };
  7. datas.Add(a);
  8. }
  9. double[][] newdata = datas.ToArray();
  10. Matrix matrix = DenseMatrix.OfColumnArrays(newdata);
  11. return matrix;
  12. }
  13. private Matrix GetMatrix(List<double[]> datas)
  14. {
  15. double[][] newdata=datas.ToArray();
  16. Matrix matrix = DenseMatrix.OfColumnArrays(newdata);
  17. return matrix;
  18. }

2、排序——主要使用MathNet.Numerics.Statics的名称空间—有问题

Matrix.Column(i).OrderBy()是升序排序
Matrix.Column(i).OrderByDescending()是降序排序

  1. private void Sort(SortMode sortmode,SortOrder sortorder)
  2. {
  3. if (Src == null) return;
  4. switch(sortmode)
  5. {
  6. case SortMode.None:
  7. break;
  8. case SortMode.Lon:
  9. switch (sortorder)
  10. {
  11. case SortOrder.Ascend:
  12. Src.Column(1).OrderBy(a=>a);
  13. break;
  14. case SortOrder.Descend:
  15. Src.Column(1).OrderByDescending(a=>a);
  16. break;
  17. }
  18. break;
  19. case SortMode.Lat:
  20. {
  21. switch(sortorder)
  22. {
  23. case SortOrder.Ascend:
  24. Src.Column(1).OrderBy(a => a);
  25. break;
  26. case SortOrder.Descend:
  27. Src.Column(1).OrderByDescending(a => a);
  28. break;
  29. }
  30. }
  31. break;
  32. case SortMode.Mileage:
  33. {
  34. switch (sortorder)
  35. {
  36. case SortOrder.Ascend:
  37. Src.Column(1).OrderBy(a => a);
  38. break;
  39. case SortOrder.Descend:
  40. Src.Column(1).OrderByDescending(a => a);
  41. break;
  42. }
  43. }
  44. break;
  45. default:
  46. break;
  47. }
  48. }

3、保存至文件CSV/TXT

首先是需要引用MathNet.Numerics.Data.Matlab这个名称空间
利用Nuget安装
Install-Package MathNet.Numerics.Data.Text
Install-Package MathNet.Numerics.Data.Matlab
image.png
成功即可!

从Github或者官网上都有MathNet关于Nuget下载的说明,如下
image.png
官网:https://numerics.mathdotnet.com/
右侧Matlab能做到的栏目,点进去就可以
image.png
具体读写操作在这里
https://numerics.mathdotnet.com/CSV.html

写CSV的时候可以用Delimiter.Write
DelimitedWriter.Write(filepath, matrix, delimiter, columnHeaders);

写TXT文件时用
只需要改变文件后缀名其实就可以,并且没有columnHeaders,delimite可以用默认的(default)”\t”或者”\r”

4、读写文件得到Matrix

Delimiter.Read

  1. //
  2. // 摘要:
  3. // Reads a MathNet.Numerics.LinearAlgebra.Matrix`1 from the given file.
  4. //
  5. // 参数:
  6. // filePath:
  7. // The path and name of the file to read the matrix from.
  8. //
  9. // sparse:
  10. // Whether the returned matrix should be constructed as sparse (true) or dense (false).
  11. // Default: false.
  12. //
  13. // delimiter:
  14. // Number delimiter between numbers of the same line. Supports Regex groups. Default:
  15. // "\s" (white space).
  16. //
  17. // hasHeaders:
  18. // Whether the first row contains column headers or not. Default: false.
  19. //
  20. // formatProvider:
  21. // The culture to use. Default: null.
  22. //
  23. // missingValue:
  24. // The value to represent missing values. Default: NaN.
  25. //
  26. // 类型参数:
  27. // T:
  28. // The data type of the Matrix. It can be either: double, float, Complex, or Complex32.
  29. //
  30. // 返回结果:
  31. // A matrix containing the data from the System.IO.TextReader.
  32. public static Matrix<T> Read<T>(string filePath, bool sparse = false, string delimiter = "\\s", bool hasHeaders = false, IFormatProvider formatProvider = null, T? missingValue = null) where T : struct, IEquatable<T>, IFormattable;

5、貌似matlab中的结构体是使用时可以定义的,然而C#的Struct不行

6、矩阵数学计算

注意操作的时候matlab的第一列的索引为1,而C#的第一列索引为0
如图为matlab代码,[E,N]是num*2维的矩阵
ones(num,1)是生成一个num维的向量。
image.png
转成C#代码
image.png

7、使用滤波程序

首先在Github上找到开源程序
https://github.com/mathnet/mathnet-filtering
image.png
我需要使用均值滤波
在其中的Src—>Median中就可以找到
然而将其引用进去也出现了OnlineFilter找不到的问题
image.png
—之后我又从Github找到的类包里把OnlineFilter.cs这个引用进来
结果发现要引用的东西实在太多了

之后我发现自己直接就错了,应该引用MathNet.Filtering这个dll
可是dll在哪里找呢
然后我在Nuget这里找到了,通过下载Nuget安装包就可以找到dll
https://www.nuget.org/packages/MathNet.Filtering
根据它提示的Package Manager语句,在VS工具-Nuget包管理器-程序包管理器控制台打开,复制粘贴入代码,就ok了
image.png

在我的项目引用中可以看到
image.png
在属性中可以找到这个dll的位置,注意他是0.7.0版本的