Любое альтернативное приближение к этому методу в Matlab? - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь преобразовать нижеприведенную функцию matlab / octave в C (Обычный способ - понять функцию matlab и кодировать ее на C с нуля). Он подгоняет данные к гауссовой кривой с использованием полиномиальной подгонки.

   function y=func(data)
   N=128;
   y1=gausswin(N,4);
   x1=[0:1/N:1-1/N]';
   P=polyfit(x1,y1,12);      
   y=polyval(P,data);

Но когда я проверил полифит функций, это показалось много работы, так как включает в себя много вызовов для дальнейших функций библиотеки октавы. Сначала он вычисляет матрицу Вандермонда, затем выполняет ее QR-разложение и вычисляет норму вектора и т. Д. *

  1. Какие другие опции / обработку я могу использовать, чтобы иметь аналогичную функциональность (аппроксимация фактической операции, описанной выше), но с некоторыми более простыми методами подбора кривой или интерполяции.

Любые указатели были бы полезны.

1 Ответ

1 голос
/ 12 мая 2011

Помимо практического значения подгонки такого многочлена к гауссову, вы можете просто проанализировать поведение вашего кода:

N=128;
y1=gausswin(N,4);
x1=[0:1/N:1-1/N]';
P=polyfit(x1,y1,12);

Вывод этого раздела всегда будет одинаковым, поэтомуВы можете выполнить это в MATLAB или Octave и просто извлечь полином P для использования в вашем коде C, где вы включаете его как константу.Это менее гибко, чем переписывать все в C, но также быстрее.

В противном случае вы можете взглянуть на BLAS : BLAS определяет API для библиотек, используемых для линейной алгебры, таких как LAPACK (который используется MATLAB).Я подозреваю, что многие из этих библиотек будут реализовывать базовые операции, которые вам необходимы.

Добавление : Если у вас нет небольшого опыта работы с числовыми вычислениями или вы просто хотите отнять у вас много работы, вы можете рассмотреть Matlab Coder .

...