У меня есть научный код Matlab, и я хочу точно сравнить результат из кода Matlab, содержащий вызов функции invv (pin) (inval) Matlab для вывода того же кода Matlab, вызывающего теперь реализацию C++ pinv().
Я использую код Matlab, чтобы вызывать pinv C++ вместо Matlab pinv(): я компилирую pinV C++ в файл mex, используя соответствующий API.
Может ли вызов функции, скомпилированной в файл mex, ввести некоторую численную разницу в верхней части разницы в реализации между Matlab и C++ pinv()?
Все матричные операции, выполняемые MATLAB, реализуются библиотекой LAPACK, поэтому да, могут быть различия, вызванные реализацией. Если то, что вы спрашиваете, "использует ли библиотека LAPACK разные аппаратные функции с плавающей запятой, чем компилируемый код C++", что маловероятно, если компилятору C++ не предписывается генерировать код, предназначенный для конкретной платформы HW, подмножества доступных.
Однако, даже если коды аналогичны на уровне источника, LAPACK скомпилирован из исходного кода FORTRAN, в то время как пользовательская подпрограмма выводится из C++; оптимизация, выполняемая разными компиляторами, различна. Таким образом, существует высокая вероятность того, что - даже с поразительно похожим исходным кодом - получившийся исполняемый код будет другим. Это может привести к разным результатам.
Примечание: манипуляция данными (т.е. Путь передается функции) не изменяет содержание данных; это может быть вопрос времени выполнения, а не числового отклонения. MEX - это, в основном, соглашение о том, как собственные структуры данных MATLAB представляются любой рутине, обрабатывающей их; эффективность рутинного доступа к данным снова является вопросом реализации.
Дальнейшее замечание: нужно сказать, что формат FORTRAN в памяти 2D-данных является первым в столбце, тогда как C-и-семейная компоновка 2D-данных в памяти является первой строкой (я говорю об индексировании). Это также может вызывать различия во времени выполнения (как и в коде exec), в зависимости от того, как алгоритм реализации обращается к данным, поскольку производительность современных HW- систем сильно зависит от, например, количества промахов в кэше.
mxArray
есть только буфер. Это непрозрачный тип, но он хранит старые данные где-то внутри. Данные не будут изменены, если вы не измените их путем преобразования либо ввода, либо вывода в MATLAB .