将.m转换为.mex以获得Octave加速

时间:2014-04-11 17:51:41

标签: matlab compilation octave mex

我有一个.m脚本在Octave中运行相当缓慢(通常约2分钟),在MATLAB中运行速度不是很慢(约7秒),我认为通过编译程序可以提高性能到.mex文件(特别是对于Octave)。不幸的是,MATLAB编译器函数mcc不再支持-x选项来生成.mex文件。

有解决方法吗?


修改:回应评论

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

我只使用一个简单的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 ++不熟悉)。

    < / LI>

1 个答案:

答案 0 :(得分:0)

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