Подтвердить что ты не робот

Получение массива double [] из прямоугольного массива double [,]

Предположим, у вас есть массив вроде:

double[,] rectArray = new double[10,3];

Теперь вы хотите, чтобы fouth row в виде двойного [] массива из 3 элементов, не делая:

double[] fourthRow = new double[]{rectArray[3,0],
                                  rectArray[3,1], 
                                  rectArray[3,2]};

Возможно ли это? Даже используя подход маршала. Какой-то подход?

Спасибо!

4b9b3361

Ответ 1

Вы можете использовать метод Buffer.BlockCopy:

const int d1 = 10;
const int d2 = 3;
const int doubleSize = 8;

double[,] rectArray = new double[d1, d2];
double[] target = new double[d2];

int rowToGet = 3;
Buffer.BlockCopy(rectArray, doubleSize * d2 * rowToGet, target, 0, doubleSize * d2);

Ответ 2

LINQ на помощь:

var s = rectArray.Cast<double>().Skip(9).Take(3).ToArray();

Объяснение: Кастинг многомерного массива выравнивает его до одномерного массива. После этого все, что нам нужно сделать, это перейти к элементу, который нам нужен (4-й элемент в 2-D массиве разрешает пропустить (9)...) и взять из него 3 элемента).

Ответ 3

Почему бы не создать общий метод расширения?

    public static T[] GetRow<T>(this T[,] input2DArray, int row) where T : IComparable
    {
        var width = input2DArray.GetLength(0);
        var height = input2DArray.GetLength(1);

        if (row >= height)
            throw new IndexOutOfRangeException("Row Index Out of Range");
        // Ensures the row requested is within the range of the 2-d array


        var returnRow = new T[width];
        for(var i = 0; i < width; i++)
            returnRow[i] = input2DArray[i, row];

        return returnRow;
    }

Как и все, что вам нужно сделать, это:

array2D = new double[,];
// ... fill array here
var row = array2D.GetRow(4) // Implies getting 5th row of the 2-D Array

Это полезно, если вы пытаетесь связать методы после получения строки и могут быть полезны также с помощью команд LINQ.

Ответ 4

Вероятно, вы захотите использовать неровный массив. Это не массив из 10 на 3, а массив массивов.

Что-то вроде:

        double[][] rectArray;
         ....
        double [] rowArray = rectArray[3];

Есть много мест, где можно узнать больше о зубчатых массивах. Например Динамически созданный зубчатый прямоугольный массив

Ответ 5

Если вы должны использовать прямоугольный массив и просто хотите упростить синтаксис, вы можете использовать метод для получения строки следующим образом:

double[] fourthRow = GetRow(rectArray, 3);

public static T[] GetRow<T>(T[,] matrix, int row)
{
    var columns = matrix.GetLength(1);
    var array = new T[columns];
    for (int i = 0; i < columns; ++i)
        array[i] = matrix[row, i];
    return array;
}

Ответ 6

Хотя это старая нить, добавление к Джозефу Стуртеванту может быть полезным. Его функция выйдет из строя, если первый столбец матрицы не равен нулю, но еще одно целое. Это, например, всегда случай в случае извлечения данных из Excel, например

object[,] objects = null;
Excel.Range range = worksheet.get_Range("A1", "C5");
objects = range.Cells.Value; //columns start at 1, not at 0

Функция GetRow может быть изменена следующим образом:

    public static T[] GetRow<T>(T[,] matrix, int row, int firstColumn)
    {
        var columns = matrix.GetLength(1);
        var array = new T[columns];
        for (int i = firstColumn; i < firstColumn + columns; ++i)
            array[i-firstColumn] = matrix[row, i];
        return array;
    }