Удаление константных столбцов в C#

227
03 октября 2017, 03:01

Есть матрица List<double[]>. Нужно удалить столбцы, которые не изменяются у каждой строки, например есть матрица:

0 1 2 3
1 1 3 3
3 1 4 3
4 1 2 3

Нужно удалить тут 2й и последний столбцы. Может можно это сделать нативными методами? Спасибо.

Answer 1

Если double[] - это строки, то, как вариант, можно преобразовать матрицу в
List < List < double > >:

static class Converter<T>
{
    public static List<List<T>> ToListsOfLists(List<T[]> matrix) {
        var result = new List<List<T>>();
        for (var i = 0; i < matrix[0].Length; i++)
            result.Add(new List<T>());
        for (var i = 0; i < matrix.Count; i++)
            for (int j = 0; j < matrix[0].Length; j++)
                result[i].Add(matrix[j][i]);
        return result;
    }
}

А затем уже удалить нужные столбцы:

private static void DeleteEqualColumns(List<List<double>> matrix) {
        var index = 0;
        while (index < matrix.Count) {
            var columnIsEqual = true;
            var firstElementInColumn = matrix[index][0];
            for (var i = 1; i < matrix[0].Count - 1; i++)
                if (firstElementInColumn != matrix[index][i]) {
                    columnIsEqual = false;
                    break;
                }
            if (columnIsEqual)
                matrix.Remove(matrix[index]);
            index++;
        }
    }

Если double[] - это столбцы, то все достаточно просто, так как удалять столбцы можно, используя команду класса List.Remove(column);

private static void DeleteEqualColumns(List<double[]> matrix) {
        var index = 0;
        while (index < matrix.Count) {
            var columnIsEqual = true;
            var firstElementInColumn = matrix[index][0];
            for (var i = 1; i < matrix[index].Length - 1; i++)
                if (firstElementInColumn != matrix[index][i]) {
                    columnIsEqual = false;
                    break;
                }
            if (columnIsEqual)
                matrix.Remove(matrix[index]);
            index++;
        }
    }

Используется while, а не for, потому что когда удаляется столбец, Count у List изменяется, а переменная-счетчик i у for не изменяется, и неизбежен выход за пределы массива.

READ ALSO
Как отрисовывать по пикселям в opengl?

Как отрисовывать по пикселям в opengl?

Использую библиотеку SharpGL в WPF приложении, как можно нарисовать линию с нужными размерами и отступами в пикселях? И как сделать так, чтобы...

258
Массив из цифр каждого разряда даного числа

Массив из цифр каждого разряда даного числа

Подскажите,пожалуйста, как сделать из числа integer массив, элементами которого будут цифры каждого разряда данного числа в C#? (Число нам нада...

318
Почему EAP не быстрее APM?

Почему EAP не быстрее APM?

Здравствуйте

213
Возможно ли отловить ошибку WinApi на C#?

Возможно ли отловить ошибку WinApi на C#?

Добрый вечер, товарищи!

278