如何在Math.Net中提取多维数组的子矩阵并转置?
Math.NET 提取三维数组子矩阵并转置的实现方法
方法一:直接从三维数组提取子矩阵(推荐)
不需要先将整个三维数组转换为大矩阵,直接针对每个k值提取对应的3x3子矩阵,再调用转置方法即可:
// 提取k=0对应的3x3子矩阵并转置 var mat0 = DenseMatrix.Create(3, 3, (i, j) => matA[0, i, j]); Matrix<double> mat0Transposed = mat0.Transpose(); // 提取k=1对应的3x3子矩阵并转置 var mat1 = DenseMatrix.Create(3, 3, (i, j) => matA[1, i, j]); Matrix<double> mat1Transposed = mat1.Transpose();
方法二:从已转换的大矩阵中提取子矩阵
如果你已经通过DenseMatrix.OfArray(matA)得到了大矩阵matAnew,需要明确这个大矩阵的结构:三维数组[2,3,3]会被转换为6行3列的二维矩阵(2个3行的子矩阵按行拼接)。此时SubMatrix方法的参数定义为:SubMatrix(起始行索引, 提取行数, 起始列索引, 提取列数)
具体代码如下:
// 提取k=0对应的前3行子矩阵并转置 var subMat0 = matAnew.SubMatrix(0, 3, 0, 3); var subMat0Transposed = subMat0.Transpose(); // 提取k=1对应的后3行子矩阵并转置 var subMat1 = matAnew.SubMatrix(3, 3, 0, 3); var subMat1Transposed = subMat1.Transpose();
补充说明
- 若想节省内存、直接在原矩阵上修改转置结果,可使用
TransposeInPlace()方法替代Transpose()。 - 方法一更直观,能避免因大矩阵结构混淆导致的索引错误,推荐优先使用。
内容的提问来源于stack exchange,提问作者hasahmet
相关产品推荐
相关产品推荐

