【发布时间】: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