如何从Matlab中的递归函数返回一系列数字

时间:2017-08-19 00:32:59

标签: matlab recursion dynamic-programming return-type

我使用动态编程来寻找两个矩阵之间的最短路径。我打印了最短路径的所有步骤,但我也想保存所有这些,以便我可以将它们打印为2D图形。我编写了如下代码,但它不起作用。我在互联网上搜索,似乎需要通过一个对象作为参数传递?有谁知道如何从返回值中获取路径矩阵?提前谢谢!

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

1 个答案:

答案 0 :(得分:1)

您可以使用两种方法,在函数调用之间保留值或将所有结果存储在" global"变量

由于代码的混乱和长度(并非一切都与问题相关),我将以一个因子程序为例来描述该方法。

让一个函数不仅计算给定数字的递归的阶乘,而且还计算所有数字的中间结果小于它自己的函数。我相信这是你所需要的密切模型。函数应该做的一个例子:

>> [fact, list] = factorial(5)
>>     fact = 120
>>     list = [1, 2, 6, 24, 120]

方法1:使用persistent变量

Persistent variables相当于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

可以使用如下:

>> [f, list] = factorial(4)

f =
    24

list =
     1     2     6    24

>> clear factorial
>> [f, list] = factorial(3)

f =
     6

list =
     1     2     6

方法2:在嵌套函数中共享变量

MATLAB支持nested function definitions,其中内部函数可以从外部函数共享变量,并在不明确作为参数传递的情况下修改它们。使用此方法的示例代码:

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文件,这是不必要且低效的。除了解决您的问题之外,这两种方法可以用来避免这种情况。