Извлечение подматриц из матрицы, диагональ которой не равна нулю
Я новичок в C#
и я работаю с matrix
с помощью Math.Net
пакет. у меня есть matrix
показано на рисунке ниже:
Что я хотел бы сделать, это извлечь все submatrices
размера 4x4
имея значения по диагонали, отличные от нуля. Я раскрасил их на картинке.
1 ответ
const int height = 8;
const int width = 7;
var matrix = DenseMatrix.OfArray(new double[height, width]
{
{ 1, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0 },
{ 0, 1d/2, 1d/2, 0, 0, 0, 0 },
{ 0, 0, 2d/3, 1d/3, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 1 }
});
var size = 4;
var submatrices =
// for all possible starting points
Enumerable.Range(0, height - size + 1).SelectMany(Row =>
Enumerable.Range(0, width - size + 1).Select(Column => new { Row, Column }))
// find 4x4 submatrices
.Select(p => matrix.SubMatrix(p.Row, size, p.Column, size))
// where all diagonal elements are not zero
.Where(submatrix => submatrix.Diagonal().All(e => e != 0));
foreach (var submatrix in submatrices)
Console.WriteLine(submatrix);
Результат:
DenseMatrix 4x4-Double
1 0 0 0
0 1 0 0
0 0,5 0,5 0
0 0 0,666667 0,333333
DenseMatrix 4x4-Double
0,5 0,5 0 0
0 0,666667 0,333333 0
0 0 1 0
0 0 0 1
DenseMatrix 4x4-Double
0,666667 0,333333 0 0
0 1 0 0
0 0 1 0
0 0 0 1
DenseMatrix 4x4-Double
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1