代码之家  ›  专栏  ›  技术社区  ›  Pelican

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

  •  0
  • Pelican  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  1
  •   crazyGamer    7 年前

    两种方法 可以使用,在函数调用之间保留值或将所有结果存储在“全局”变量中。

    由于您的代码杂乱无章,而且很长(并非所有内容都与问题相关),我将 描述方法。

    设一个函数,它不仅计算给定数的阶乘 递归地 ,而且所有的中间结果都小于数本身。我相信这是一个接近你所需要的模型。函数应该做什么的示例:

    >> [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:在嵌套函数中共享变量

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