有没有一种方法可以做到这一点,而不仅仅是使用包含大量 if 语句的 for 循环?
当然。递归呢?当然,不能保证 Matlab 有尾调用优化。
例如,在一个名为filename.m的文件中
function out=filename(arr)
out=myfun(in);
function local_out=myfun(arr)
if isscalar(arr)
if arr
local_out=sort([0,1:arr,1:arr]); % this is faster
else
local_out=0;
end
else
local_out=[myfun(arr(1:end-1)),myfun(arr(end))];
end
end
end
在cmd中,输入
input=[1,0,2];
filename(input);
你可以去掉父函数。我添加它只是希望 Matlab 能够发现 filename.m 中的递归并对其进行优化。
想要一个矢量化函数来处理它。
当然。尽管我没有看到在这样一个无法推广到其他应用程序的独特难题中进行矢量化的意义。我也不认为性能会有所提升。
例如,假设输入是 1×N。在cmd中,输入
input=[1,0,2];
cell2mat(arrayfun(@(x)sort([0,1:x,1:x]),input,'UniformOutput',false)
基准测试
在 R2018a 中
>> clear all
>> in=randi([0,100],[1,100]); N=10000;
>> T=zeros(N,1);tic; for i=1:N; filename(in) ;T(i)=toc;end; mean(T),
ans =
1.5647
>> T=zeros(N,1);tic; for i=1:N; cell2mat(arrayfun(@(x)sort([0,1:x,1:x]),in,'UniformOutput',false)); T(i)=toc;end; mean(T),
ans =
3.8699
Ofc,我用更多不同的输入进行了测试。 “矢量化”方法的长度总是大约两倍。
结论:递归更快。