【问题标题】:Converting .m to .mex for Octave speed-up将 .m 转换为 .mex 以加速 Octave
【发布时间】:2015-12-26 22:54:09
【问题描述】:

我有一个 .m 脚本,它在 Octave 中运行得相当慢(通常大约 2 分钟),而在 MATLAB 中运行得不是那么慢(大约 7 秒),我认为通过将程序编译为.mex 文件(尤其是 Octave)。不幸的是,MATLAB 编译器函数mcc 不再支持-x 选项来生成.mex 文件。

有解决办法吗?


编辑:回应cmets

以下代码的目的是平滑频谱,同时保留大部分完整的高功率区域。它通过取局部平均值来实现这一点,窗口大小取决于某个点的频谱幅度。

我只用一个简单的for 循环来做到这一点,这就是它如此缓慢的原因(矢量化并不容易,因为它需要一个包含太多元素的矩阵以耗尽可用内存。

我正在使用具有~600,000 元素的声音向量,因此矩阵需要~3*10^11 元素,这对于我的 32 位计算机上的稀疏矩阵来说甚至太大了。

function smoothsig=smoothnoise(sig,wins,method)
% Smooths a signal "sig", leaving hi power regions intact (mostly).
% "wins" is a window size for smoothing
% "method" determines the relative smoothing of various parts of the spectrum
% "method" can be a handle to any function <=1 on [0,1] 

mx=max(abs(sig)); mn=min(abs(sig)); range=mx-mn;
len=(size(sig)); len=len(1);

if ~(exist('method','var'))
    method=1;
end

winsize=round(wins* winfunction((abs(sig)-mn)/range,method) );
smoothsig=zeros(size(sig));

for k=1:wins
    winsz=min(k-1,winsize(k));
    smoothsig(k)=mean(sig(k-winsz:k+winsz));
end

for k=wins+1:len-wins
    winsz=winsize(k);
    smoothsig(k)=mean(sig(k-winsz:k+winsz));
end

for k=len+1-wins:len
    winsz=min(len-k,winsize(k));
    smoothsig(k)=mean(sig(k-winsz:k+winsz));
end

end

%-------------------------------------------------------------
function y=winfunction(x, method)
    % Determines the window function
    if isa(method, 'function_handle')
        y=method(x);
    elseif isscalar(method) & method==1         % Uniform window size
        y=ones(size(x));
    elseif isvector(method) & method(1)==2      % Sharp cutoff for window size
        y=x<method(2);
    elseif isvector(method) & method(1)==3      % Polynomial change
        y=(1-x).^method(2);
    end
end

  • 我对 C++ 不是很熟悉,因此如果可能的话,我宁愿以一种更自动化的方式来完成这项工作,而不是用另一种语言手动重新编码。

  • 我没有听说过 .oct 文件,所以我会调查一下,但也请参阅上面的评论(我不熟悉 C++)。

【问题讨论】:

  • 向我们展示代码。两个解释器之间如此巨大的性能差异是不正常的。
  • 缺少 -x 选项仅意味着您必须执行两个步骤。 1) 生成 C/C++ 代码 2) 编译 C/C++ 代码。
  • 如果您只是因为 Octave 的性能差异而将其转换为 mex,请不要这样做。改写一个 oct 文件,它更 C++ 风格,也更灵活。但我同意@juliohm,首先确保你写的代码“好”。 Matlab 有 JIT,而 Octave 没有(嗯,有点。取决于你如何构建它),所以如果你不按照设计语言的方式编写,你的性能会受到很大影响。

标签: matlab compilation octave mex


【解决方案1】:

如果您尝试从 MATLAB 代码自动生成 C 代码,然后将其编译为 .mex 文件以加快速度,则此功能现在存在于 MATLAB Coder 产品中,而不是 MATLAB 编译器中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2011-11-02
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多