Me gustaría una función para convertir una matriz de dimensión única int [480000] en una matriz 2d de tamaño int [800,600]. ¿Puede ayudarme por favor cómo se puede hacer esto?Intentando convertir un int [] en int [,] usando C#
Respuesta
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];
}
}
Dependiendo de su diseño de almacenamiento, puede que tenga que usar i + 800*j
en su lugar.
UPD (llenado fijado por columna en lugar de por fila, aquí es la versión correcta)
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;
}
Por 1.000.000 de elementos funciona 33 ms en mi máquina. Muy rápido con 1 for
loop.
1) 'arr.Length' ->' array.Length'. 2) Nota: copiará la matriz columna por columna, no fila por fila como lo esperaría normalmente. –
Lo siento, estaba mal. He actualizado la respuesta, estaba equivocado en tamaños de dimensión e indexex. En el segundo parámetro, pasamos el número de columnas que necesitamos, luego calculamos el recuento de filas y llenamos una nueva matriz de 2d. –
¿Realmente desea mover físicamente los datos o sería suficiente una "Vista" de 800x600?
Se puede usar un envoltorio de esta manera:
// 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;
}
}
Y usarlo como:
double[] data = new double[4800];
var wrapper = new MatrixWrapper<double>(data, 80, 60);
wrapper[2, 2] = 2.0;
- 1. C# Convertir IntPtr en int
- 2. Cómo convertir int * a int
- 3. En Kotlin ¿Cómo puedo convertir un int? a un Int
- 4. Convertir int en CGFloat
- 5. Cómo convertir o convertir un int sin firmar a int en C?
- 6. declarar un int anulable (int?) Usando XAML
- 7. convertir int color a int componentes
- 8. php convertir int formateado a int
- 9. Cómo convertir int a enum en C++?
- 10. ¿Convertir int a cadena?
- 11. lista <int> convertir a int []
- 12. Cómo convertir un carácter ascii en un int en C
- 13. Convertir cadena a matriz int usando LINQ
- 14. C++ uint, unsigned int, int
- 15. convertir doble a int
- 16. ¿Convertir ascii a int?
- 17. Convertir iterador a int
- 18. C# Convertir cadena decimal a Int
- 19. Usando un int como clave NSDictionary?
- 20. C# convertir un decimal a un int con seguridad
- 21. convertir IQueryable <int> a <int>
- 22. Convirtiendo un doble en int en C#
- 23. tipo de int * (*) (* int, int * (*)())
- 24. problema joda nueva DateTime (int, int, int, int, int, int)
- 25. Cómo convertir un NSInteger a un int?
- 26. ¿Cómo convertir un Enum a un int?
- 27. ¿Cómo puedo convertir un (StorableArray (Int, Int) Word8) en un byteString perezoso?
- 28. Int a Char en C#
- 29. usando uint vs int
- 30. qué int no puede ** puede convertir en const int ** en C++
j debe ser de hasta 600, por supuesto :) Gracias – user11977
@smerriman. Gracias lo que recibo por copiar y pegar. –