Самый простой способ, который я знаю, это использовать один размерный массив. Это уменьшит сложность, фрагментацию памяти, а также будет иметь лучшую производительность. Я действительно делаю это в моем проекте. Вы можете использовать ручное индексирование, например array[i][j] = oneDimArray[i *n + j]
, и передать n в качестве параметра функции. И вы сделаете только одно исправление, как вы сделали в своем примере:
public void process(float[] oneDimInput, int numberOfColumns)
{
unsafe
{
fixed (float* inputPtr = &oneDimInput[0])
{
// C function signature is someFuction(
// float* input,
// int number of columns in oneDimInput
// int numberOfChannels,
// int length)
functionDelegate(inputPtr, numberOfColumns, 2, oneDimInput[0].length);
}
}
}
Также необходимо отметить, что двумерные массивы редко используются в высокопроизводительных вычислительных библиотеках, таких как Intel MKL, Intel IPP и многих других. Даже интерфейсы BLAS и Lapack содержат только одномерные массивы и эмулируют два измерения, используя упомянутый мной подход (по соображениям производительности).