如何在Math.NET Numerics中从一个矩阵复制指定列到新矩阵?
从Math.NET矩阵中提取指定列生成新矩阵
看你的代码片段,应该是在用Math.NET Numerics处理矩阵对吧?刚好这个库提供了非常简洁的方法来实现提取指定列的需求,我给你两种实用的方案:
方案1:用Columns方法(最省心的方式)
Matrix<T>自带的Columns方法可以直接接收列索引数组,一步生成包含指定列的新矩阵,完全匹配你的需求:
using MathNet.Numerics.LinearAlgebra; // 先还原你的Matrix-1 var matrix1 = Matrix<double>.Build.Dense(3, 4, (i, j) => i * 10 * j); // 定义要提取的列索引 int[] indicesToBeCopied = new int[] { 0, 3 }; // 一键提取指定列 var matrix2 = matrix1.Columns(indicesToBeCopied); // 输出看看结果 Console.WriteLine(matrix2.ToString());
运行后你会得到完全符合预期的Matrix-2:
Matrix-2 3x2-Double 0 0 0 30 0 60
方案2:用SubMatrix方法(更灵活的进阶方式)
如果你之后有需要同时筛选行的需求(比如只取第1到第2行),SubMatrix会更合适。针对当前需求,我们只需要指定全部行,再传入目标列索引就行:
// 提取全部行 + 指定列 var matrix2 = matrix1.SubMatrix( rowStart: 0, rowCount: matrix1.RowCount, columnIndices: indicesToBeCopied );
这个方法和Columns的结果完全一致,但扩展性更强,适合复杂的矩阵切片场景。
小提醒
- 要确保你传入的列索引都是有效的(比如你的Matrix-1是4列,索引得在0-3之间),不然会触发索引越界的异常哦。
- 默认情况下,这两种方法都会返回新的矩阵副本,修改新矩阵不会影响原矩阵。如果需要共享内存的视图(比如处理超大矩阵想省内存),可以在构建时指定存储方式,但一般场景下用默认的副本就足够了。
内容的提问来源于stack exchange,提问作者skm




