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.

Foi ú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];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top