Матлаб функции в Си / Си++


Из-за программного ограничения, я не могу использовать стандартные библиотеки, математике.сек, алгоритм, шаблоны, рядный, или увеличить. Я также использую стандарт C (по ISO С99) такие, что массив не зарезервированное ключевое слово, как это в Visual студии.

Мне нужно дублировать Матлаб любую функцию в C / C++ для массива. В настоящее время я написал две функции с разными входами, в зависимости от размера массива.

  • Можно ли написать один любой функции без использования шаблонов?
  • Как я могу улучшить производительность?

Я стремлюсь к константной корректности, производительности/эффективности, и, чтобы избежать неявного преобразования типов.

bool any(bool* array, const int N){
    // mimics the behavior of Matlab's any() function. Returns true if any element of the array is true
    bool val;
    val = array[0] == true;
    int i = 0;
    while (val == false && i < N){
        val = array[i++] == true;
    }
    return val;
}

bool any(bool** array, const int nRow, const int nCol){
    // mimics the behavior of Matlab's any() function. Returns true if any element of the array is true
    bool val;
    val = array[0][0] == true;
    int i = 0;
    while (i < nRow && val == false){
        int j = 0;
        while (j < nCol && val == false){
            val = array[i][j++] == true;
        }
        i++;
    }
    return val;
}


Комментарии
2 ответа

Я хотел бы предложить, имея реализации 2Д вызывать реализацию 1Д, а не дублирования "либо" логика в обоих реализациях, например

bool any(bool** array, const int nRow, const int nCol){
// mimics the behavior of Matlab's any() function. Returns true if any element of the array is true
bool val = false;

for (int i = 0; i < nRow && val == false; ++i)
{
val = any(array[i], nCol); // call 1D version of any
)
return val;
}

2
ответ дан 6 октября 2011 в 08:10 Источник Поделиться

В зависимости от того, как компилятор реализует это.
Это может быть быстрее, чтобы allcoate блок нулевой памятью и сравнить его (это конечно будет зависит от платформы). Некоторые наборы инструкций позволят всем следующим за один ОП код (каждая строка). Но, конечно, любые улучшения скорости вы должны быть взвешены против читабельности.

bool any(bool* array, size_t N)
{
void* comp = alloca(sizeof(bool) * N);
bzero(comp, sizeof(bool) * N);
int result = bcmp(array, comp, sizeof(bool) * N);

return result != 0;
}

Лично я думаю, что вы дороги обеспокоены микро-оптимизаций.
Это должно быть неважно для вас. Компилятор очень хорош в такого рода оптимизация макросов.

1
ответ дан 4 октября 2011 в 07:10 Источник Поделиться