我使用动态编程来寻找两个矩阵之间的最短路径。我打印了最短路径的所有步骤,但我也想保存所有这些,以便我可以将它们打印为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
答案 0 :(得分:1)
您可以使用两种方法,在函数调用之间保留值或将所有结果存储在" global"变量
由于代码的混乱和长度(并非一切都与问题相关),我将以一个因子程序为例来描述该方法。
让一个函数不仅计算给定数字
>> [fact, list] = factorial(5)
>> fact = 120
>> list = [1, 2, 6, 24, 120]
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
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
文件,这是不必要且低效的。除了解决您的问题之外,这两种方法可以用来避免这种情况。