Obtendo subconjuntos de matriz com eficiência
Pergunta
Existe uma maneira eficiente de tomar um subconjunto de uma matriz C # e passá-lo para outro pedaço de código (sem modificar a matriz original)? Eu uso CUDA.net que tem uma função que copia uma matriz para a GPU. Gostaria de exemplo passar a função de um décimo da matriz e, assim, cada cópia 10 da matriz para a GPU separadamente (para fins pipelining).
Copiar a matriz desta forma deve ser tão eficiente quanto copiá-lo de uma só vez. Isso pode ser feito com o código inseguro e apenas referenciando o local de memória adequada, mas diferente do que eu não tenho certeza. A função CopyTo copia todo o array para outro array de modo que este não parece útil.
Solução
Ok, eu mal entendido a pergunta antes.
O que você quer é System.Buffer.BlockCopy ou System.Array.Copy .
As formas LINQ será horrivelmente ineficiente. Se você é capaz de reutilizar o buffer que você está copiando para, que também irá ajudar a eficiência, evitando a criação de uma nova matriz de cada vez - basta copiar por cima. A menos que você pode dividir sua matriz "grande"-se igualmente, porém, você vai precisar de um novo para o último caso.
Outras dicas
Eu não tenho certeza o quão eficiente este é, mas ...
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
}
Você poderia tentar Marshal.Copy se você precisa ir de um array de bytes para um ponteiro não gerenciado. Isso evita a criação de código inseguro si mesmo.
Edit: Isso claramente só funcionará se você reimplementar a sua API. Desculpe - incompreendido. Você quer um método subarray eficiente.
Parece-me que o que você realmente quer é uma API na classe original do formulário
void CopyToGpu(byte[] source, int start, int length);
Você pode usar métodos de extensão e retorno rendimento:
public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
yield return array[currentIndex];
}