2010-07-24 3 views

ответ

5
public static T[,] Convert<T>(this T[] source, int rows, int columns) 
{ 
    int i = 0; 
    T[,] result = new T[rows, columns]; 

    for (int row = 0; row < rows; row++) 
    for (int col = 0; col < columns; col++) 
     result[row, col] = source[i++]; 
    return result; 
} 
1
for (int i = 0; i < 800; ++i) { 
    for (int j = 0; j < 600; ++j) { 
     m[i, j] = a[600*i + j]; 
    } 
} 

В зависимости от макета хранения, возможно, потребуется использовать i + 800*j вместо этого.

+1

J должна быть до 600, конечно :) – user11977

+0

Спасибо @smerriman. Спасибо, что я получил для копирования. –

1

UPD (фиксированное наполнение колонки, а не по строкам, вот правая версия)

private static T[,] create2DimArray<T>(T[] array, int n) 
     { 
      if (n <= 0) 
       throw new ArgumentException("Array M dimension cannot be less or equals zero","m"); 
      if (array == null) 
       throw new ArgumentNullException("array", "Array cannot be null"); 
      if (array.Length == 0) 
       throw new ArgumentException("Array cannot be empty", "array"); 

      int m = array.Length % n == 0 ? array.Length/n : array.Length/n + 1; 
      var newArr = new T[m,n]; 
      for (int i = 0; i < arr.Length; i++) 
      { 
       int k = i/n; 
       int l = i % n; 
       newArr[k, l] = array[i]; 
      } 

      return newArr; 
     } 

Для 1000000. элементов он работает 33 мс на моей машине. Действительно быстро с петлей 1 for.

+2

1) 'arr.Length' ->' array.Length'. 2) Примечание: он скопирует столбец массива по столбцу, а не по строкам, как вы обычно ожидали. –

+0

Извините, не так. Я обновил ответ, я ошибся в размерах и индексах. Во втором параметре мы передаем количество столбцов, которые нам нужны, затем вычисляем количество строк и заполняем новый 2d-массив. –

5

Действительно ли вы хотите физически перемещать данные или было бы достаточно 800x600 «Просмотр»?
Вы можете использовать оболочку, как это:

// error checking omitted 
class MatrixWrapper<T> 
{ 
    private T[] _data; 
    private int _columns; 

    public MatrixWrapper(T[] data, int rows, int columns) 
    { 
     _data = data; 
     _columns = columns; 
     // validate rows * columns == length 
    } 

    public T this[int r, int c] 
    { 
     get { return _data[Index(r, c)]; } 
     set { _data[Index(r, c)] = value; } 
    } 

    private int Index(int r, int c) 
    { 
     return r * _columns + c; 
    } 
} 

И вы используете это нравится:

 double[] data = new double[4800]; 
     var wrapper = new MatrixWrapper<double>(data, 80, 60); 
     wrapper[2, 2] = 2.0; 
Смежные вопросы