Мне нужна функция для преобразования одного массива измерений int [480000] в массив 2d размера int [800,600]. Не могли бы вы помочь мне, как это можно сделать?Попытка конвертировать int [] в int [,] с помощью C#
ответ
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;
}
for (int i = 0; i < 800; ++i) {
for (int j = 0; j < 600; ++j) {
m[i, j] = a[600*i + j];
}
}
В зависимости от макета хранения, возможно, потребуется использовать i + 800*j
вместо этого.
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
.
1) 'arr.Length' ->' array.Length'. 2) Примечание: он скопирует столбец массива по столбцу, а не по строкам, как вы обычно ожидали. –
Извините, не так. Я обновил ответ, я ошибся в размерах и индексах. Во втором параметре мы передаем количество столбцов, которые нам нужны, затем вычисляем количество строк и заполняем новый 2d-массив. –
Действительно ли вы хотите физически перемещать данные или было бы достаточно 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;
- 1. Попытка конвертировать int в строку
- 2. Int -> [INT] конвертировать
- 3. конвертировать char * в int * C++
- 4. C++ конвертировать int в строку?
- 5. конвертировать двойной в int с помощью объединения?
- 6. не может конвертировать из 'int *' в 'int'
- 7. Невозможно Implicitly конвертировать тип int [] в int
- 8. Как конвертировать ИНТ [] в Int [,] - C#
- 9. конвертировать bool в int?
- 10. Конвертировать поплавок в int
- 11. java конвертировать в int
- 12. конвертировать Int64Index в Int
- 13. Entity Framework C# конвертировать int в bool
- 14. C Программирование: конвертировать int * в char *
- 15. C++ Word-int to int
- 16. C++ конвертировать int и строку в char *
- 17. C# конвертировать UTC int в объект DateTime
- 18. Как конвертировать Int во время в C#?
- 19. конвертировать C++ int в VARBINARY и обратно
- 20. Конвертировать большой int, чтобы плавать в C
- 21. Как назначить int int * с помощью метода в C?
- 22. Конвертировать Double to Int
- 23. Конвертировать int, чтобы удвоить
- 24. Python: попытка конвертировать строку в int, получить ошибку для int invalid literal для int() с базой 10: ''
- 25. Конвертировать datetime int в datetime
- 26. Как конвертировать int в валюту?
- 27. Как конвертировать int в String?
- 28. Как конвертировать NSArray в [Int] с Swift
- 29. Обработка: конвертировать int в байт
- 30. конвертировать вектор из нескольких векторов int в массив int
J должна быть до 600, конечно :) – user11977
Спасибо @smerriman. Спасибо, что я получил для копирования. –