寻找一个给定矩阵的特定子矩阵

问题描述 投票:1回答:1

假设我有这个二维数组,我们称之为矩阵。

float[,] arr = { {0, 2, 7 },
                 {3, 1, 0 },
                 {6, 2, 4 } };

我必须创建一个函数,你给两个整数i和j,它将返回一个矩阵,没有i行和j列。例如,如果我传递(0,0)作为参数,我将得到

float [,] newArr = {{1, 0 },
                    {2, 4 } }

因为0行和0列被删除了。

我自己能够想到的解决方案是这个函数,它的工作原理很好,也能完成它应该做的事情,但我想要一个更小更紧凑的解决方案,这样更合理。

public Matrix subMatrix(int _i, int _j)
{
    Matrix result = new Matrix(_rows - 1, _cols - 1);
    try
    {
        if (isSquare())
        {
            List<float> listMatrix = new List<float>();
            for (int i = 0; i < _rows; i++)
                for (int j = 0; j < _cols; j++)
                {
                    if (i != _i && j != _j)
                    {
                        listMatrix.Add(matrix[i, j]);
                    }
                }
            int x = -1;
            int y = 0;
            int z = 0;
            foreach (var item in listMatrix)
            {
                if (y % (result._rows) == 0)
                {
                    x++;
                    y = 0;
                }
                result.matrix[x, y] = item;
                y++;
            }
        }
    }
    catch (IndexOutOfRangeException e)
    {
        throw e;
    }
    catch (ArgumentOutOfRangeException e)
    {
        throw e;
    }

    return result;
}

另外Matrix是我做的一个类,它基本上是一个2D数组

c# arrays matrix 2d
1个回答
1
投票

下面是一些不同方法的简短示例。

class Program
{
    static void Main(string[] args)
    {
        float[,] arr = { {0, 2, 7 },
                         {3, 1, 0 },
                         {6, 2, 4 } };
        int x = 0;
        int y = 0;
        float[,] arr2 = SubMatrix(arr, x, y);

        for (int i = 0; i < arr2.GetLength(0); i++)
        {
            for (int j = 0; j < arr2.GetLength(1); j++)
            {
                Console.Write(arr2[i, j] + " ");
            }
            Console.WriteLine();
        }
        Console.ReadKey();
    }

    private static float[,] SubMatrix(float[,] matrix, int x, int y)
    {
        float[,] result = new float[matrix.GetLength(0) - 1, matrix.GetLength(1) - 1];
        for (int i = 0; i < result.GetLength(0); i++)
        {
            for (int j = 0; j < result.GetLength(1); j++)
            {
                result[i, j] = matrix[i >= x ? i + 1 : i, j >= y ? j + 1 : j];
            }
        }
        return result;
    }
}

輸出

1 0
2 4
© www.soinside.com 2019 - 2024. All rights reserved.