2014-01-27 2 views
0

Используя ILNumerics, я пытаюсь сделать первое n число столбцов ILArray <> наиболее эффективным способом.удалить ILArray <> elements

using(ILScope.Enter(inframe) 
{ 
    ILArray<complex> frame = ILMath.check(inframe); 
    int[] dims = frame.Size.ToIntArray(); //frame is a 2d ILArray 
    frame.SetRange(complex.Zero, dims[0] -1 , (dims[1] * 2 - 1)); //doubles the size of the array with zeros. 
    //TODO- various computations. 
    frame.SetRange(null, dims[0], dims[1] - 1); //EXCEPTION: why doesn't this work? 
} 

В этом примере я пытаюсь взять только первую половину кадра, но я не в состоянии размер его обратно к первоначальным размерам. Я пробовал различные перестановки, основанные на http://ilnumerics.net/ArrayAlter.html, но не увенчались успехом.

ответ

2

Документация усадка ILNumerics массивов говорит:

Определение диапазона должны быть направлены на полный размер - для всех размеров, кроме одного, который должен быть удален.

Вы хотите удалить последнюю половину из 2-го измерения. Поэтому вы должны определить полные диапазоны для всех других измерений. Здесь, поскольку рамка является матрицей, существуют только 2 измерения. Следовательно, первое должно быть полностью рассмотрено.

Это должно облегчить работу с помощью индексатора C#. Следующий пример предполагает ваш код в классе, полученном из ILMath. В противном случае, добавьте ILMath. перед всеми full, r и end функции/свойства:

A[full, r(end/2, end)] = null; 

Берегитесь «от одной» ошибки и решения с «конца». Вместо этого вы можете использовать end/2 + 1?

Поскольку вы хотите наиболее эффективный способ, производительность, как представляется, важна для вас. В этом случае вам следует попытаться предотвратить расширение и сокращение массивов! Лучше работать с двумя массивами разного размера: большим и оригинальным. Скопируйте данные соответствующим образом. Расширение и сокращение все равно копирует данные, поэтому это не является недостатком. Кроме того, frame.Size.ToIntArray() здесь не нужен. Просто используйте frame.S[0] и frame.S[1] для длины габаритов 0 и 1.