c# - tiene - Obtener subconjuntos de matriz de manera eficiente
ejercicios de subconjuntos para primaria (4)
De acuerdo, había malinterpretado la pregunta antes.
Lo que quiere es System.Buffer.BlockCopy o System.Array.Copy .
Las formas LINQ serán horriblemente ineficientes. Si puedes reutilizar el búfer en el que estás copiando, eso también ayudará a la eficiencia, evitando crear una nueva matriz cada vez, solo copia encima. Sin embargo, a menos que pueda dividir su "gran" matriz igualmente, necesitará una nueva para el último caso.
¿Hay una manera eficiente de tomar un subconjunto de una matriz C # y pasarlo a otra parte de código (sin modificar la matriz original)? Yo uso CUDA.net que tiene una función que copia una matriz a la GPU. Me gustaría, por ejemplo, pasar la función una décima parte de la matriz y así copiar cada décimo de la matriz a la GPU por separado (para propósitos de canalización).
Copiar la matriz de esta manera debe ser tan eficiente como copiarla de una vez. Se puede hacer con un código inseguro y simplemente haciendo referencia a la ubicación correcta de la memoria, pero aparte de eso, no estoy seguro. La función CopyTo copia toda la matriz a otra matriz, por lo que no parece útil.
No estoy seguro de lo eficiente que es esto, pero ...
int[] myInts = new int[100];
//Code to populate original arrray
for (int i = 0; i < myInts.Length; i += 10)
{
int[] newarray = myInts.Skip(i).Take(10).ToArray();
//Do stuff with new array
}
Puede usar métodos de extensión y retorno de rendimiento:
public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
yield return array[currentIndex];
}
Puedes probar Marshal. Copia si necesitas pasar de una matriz de bytes a un puntero no administrado. Eso evita crear código inseguro usted mismo.
Editar: Esto claramente solo funcionaría si reimplementas su API. Lo siento - incomprendido. Desea un método de subcampo eficiente.
Me sorprende que lo que realmente quieres es una API en la clase original de la forma
void CopyToGpu(byte[] source, int start, int length);