在Matlab中如何从递归函数中返回一系列数字
我使用动态规划来寻找两个矩阵之间的最短路径。我打印了最短路径的所有步骤,但我也想保存所有步骤,以便将它们打印为二维图形。我编写了如下代码,但它不起作用。我在网上搜索过,似乎需要经过一个物体作为论据?有人知道如何从返回值中获取路径矩阵吗?提前谢谢在Matlab中如何从递归函数中返回一系列数字,matlab,recursion,dynamic-programming,return-type,Matlab,Recursion,Dynamic Programming,Return Type,我使用动态规划来寻找两个矩阵之间的最短路径。我打印了最短路径的所有步骤,但我也想保存所有步骤,以便将它们打印为二维图形。我编写了如下代码,但它不起作用。我在网上搜索过,似乎需要经过一个物体作为论据?有人知道如何从返回值中获取路径矩阵吗?提前谢谢 ttt=find_path(7,7) function pathMat = find_path(a,b) pathMat=[]; if (a==0 || b==0) return; end filename = sprintf('/Users
ttt=find_path(7,7)
function pathMat = find_path(a,b)
pathMat=[];
if (a==0 || b==0)
return;
end
filename = sprintf('/Users/name/Desktop/song1.wav');
[x, Fs]=audioread(filename);
s=x;
filename = sprintf('/Users/name/Desktop/song2.wav');
[x, Fs]=audioread(filename);
t=x;
% dynamic time warping
w=-Inf;
ns=size(s,2);
nt=size(t,2);
%% initialization
D=zeros(ns+2,nt+2)-Inf; % cache matrix
D(1,1)=0;
D(2,2)=0;
% similarity matrix (cosing similarity)
oost = zeros(ns+1,nt+1)-Inf;
for i=1:ns
for j=1:nt
oost(i+1,j+1) =
(dot(s(:,i),t(:,j))/(norm(s(:,i),2)*norm(t(:,j),2))); % = cos(theta)
end
end
%% begin dynamic programming
%find the maximal similarity between two matrix
for i=1:ns
for j=1:nt
D(i+2,j+2)=oost(i+1,j+1)+max([D(i,j+1)+oost(i,j+1), D(i+1,j)+oost(i+1,j), D(i+1,j+1)]);
end
end
d=max(D(:,nt+2));
d_len=nt+2;
while(max(D(:,d_len))==-Inf)
d_len=d_len-1;
d=max(D(:,d_len));
end
fprintf('(%d, %d)', a, b);
pathMat = [pathMat];
if (max([D(a,b+1)+oost(a,b+1), D(a+1,b)+oost(a+1,b), D(a+1,b+1)])==D(a,b+1)+oost(a,b+1))
fprintf('(%d, %d)', a-1, b);
pathMat=[pathMat;find_path(a-1,b)];
find_path(a-2,b-1);
elseif (max([D(a,b+1)+oost(a,b+1), D(a+1,b)+oost(a+1,b), D(a+1,b+1)])==D(a+1,b)+oost(a+1,b))
fprintf('(%d, %d)', a, b-1);
pathMat=[pathMat;find_path(a,b-1)];
find_path(a-1,b-2);
elseif (max([D(a,b+1)+oost(a,b+1), D(a+1,b)+oost(a+1,b), D(a+1,b+1)])==D(a+1,b+1))
find_path(a-1,b-1);
end
end
您可以使用两种方法来保留函数调用之间的值或将所有结果存储在全局变量中
由于代码的混乱和长度,并非所有内容都与问题相关,我将以阶乘程序为例来描述该方法
设一个函数,它不仅递归地计算给定数的阶乘,而且还计算小于自身数的所有中间结果。我相信这是一个接近你所需要的模型。函数应执行的操作示例:
>> [fact, list] = factorial(5)
>> fact = 120
>> list = [1, 2, 6, 24, 120]
方法1:使用持久变量
是静态函数变量的等价物,如MATLAB中的C
默认情况下,第一次使用时将持久变量分配给[]。此外,该值按预期跨函数调用保留。使用此方法定义阶乘程序的示例代码:
function [fact, list] = factorial(n)
if n <= 1
fact = 1;
else
fact = n * factorial(n-1);
end
persistent res;
res = [res, fact];
list = res;
end
方法2:在嵌套函数中共享变量
MATLAB支持,其中内部函数可以共享来自外部函数的变量,并修改它们,而无需显式地作为参数传递。使用此方法的示例代码:
function [fact, list] = factorial(n)
list = [];
fact = factorial_core(n);
function fact = factorial_core(n)
if n <= 1
fact = 1;
else
fact = n * factorial_core(n-1);
end
list = [list, fact];
end
end
除了不需要清除函数调用之间的持久变量的clear factorial之外,它的使用方式与以前相同
我建议你试一下最适合你的情况。而且,每次递归时似乎都在加载wav文件,这是不必要的,而且效率低下。除了解决您的问题之外,这两种方法也可以用来避免这种情况。最好只发布理解问题所需的代码,以避免分心和混乱。我已经发布了一个解决方案,假设一个更简单的问题为例,请检查它是否有帮助。谢谢!我使用第一种方法解决这个问题!
function [fact, list] = factorial(n)
list = [];
fact = factorial_core(n);
function fact = factorial_core(n)
if n <= 1
fact = 1;
else
fact = n * factorial_core(n-1);
end
list = [list, fact];
end
end