Pregunta

¿Hay una manera eficiente de tomar un subconjunto de una matriz C # y pasarlo a otra parte del 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 p. pasar la función un décimo de la matriz y, por lo tanto, copiar cada décima de la matriz a la GPU por separado (para fines de canalización).

Copiar la matriz de esta manera debería ser tan eficiente como copiarla de una vez. Se puede hacer con código inseguro y solo haciendo referencia a la ubicación de memoria adecuada, pero aparte de eso, no estoy seguro. La función CopyTo copia la matriz completa en otra matriz, por lo que esto no parece útil.

¿Fue útil?

Solución

Bien, ya había entendido mal la pregunta.

Lo que quiere es System.Buffer.BlockCopy o System.Array.Copy .

Las formas de LINQ serán horriblemente ineficientes. Si puede reutilizar el búfer en el que está copiando, eso también ayudará a la eficiencia, evitando crear una nueva matriz cada vez, simplemente copie por encima. A menos que pueda dividir su " grande " sin embargo, necesitará una nueva para el último caso.

Otros consejos

No estoy seguro de cuán eficiente 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 probar Marshal.Copy si necesita 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 vuelves a implementar su API. Lo siento, mal entendido. Desea un método eficiente de subarreglos.

Me parece que lo que realmente quieres es una API en la clase original del formulario

void CopyToGpu(byte[] source, int start, int length);

Puede usar métodos de extensión y rendimiento de retorno:

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top