我有一个.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 ++不熟悉)。