在Matlab上迭代一个具有一个输入和两个输出的函数时出现问题
我创建了一个函数(命名为MyFunction),给定一个矩阵a,它输出两个矩阵B和C,即[B C]=MyFunction(a) 我试图创建另一个函数,当给定矩阵a时,它将计算MyFunction(a),然后计算MyFunction(B)=[DE]和MyFunction(C)=[FG],然后计算MyFunction(D)、MyFunction(E)、MyFunction(F)和MyFunction(G),依此类推,直到它输出的矩阵开始重复。我知道这个过程必然终止在Matlab上迭代一个具有一个输入和两个输出的函数时出现问题,matlab,Matlab,我创建了一个函数(命名为MyFunction),给定一个矩阵a,它输出两个矩阵B和C,即[B C]=MyFunction(a) 我试图创建另一个函数,当给定矩阵a时,它将计算MyFunction(a),然后计算MyFunction(B)=[DE]和MyFunction(C)=[FG],然后计算MyFunction(D)、MyFunction(E)、MyFunction(F)和MyFunction(G),依此类推,直到它输出的矩阵开始重复。我知道这个过程必然终止 我真的很难构造这个代码。任何建议都
我真的很难构造这个代码。任何建议都将不胜感激。我认为您应该使用电池:
function [B]=Myfunction(A)
B=cell(1,numel(A)*2);
for n=1:numel(A)
B{n}=func1(A{n}) %%% put some processing here
B{numel(A)+n}=func2(A{n}) %%% put some other processing here
end
end
编辑:重写了错误的alg
function [list] = newFunction(A) % returns all matrix generated matrix
list{1}=A;
done=0;
ii = 1;
while(~done)
[B C] = myFunction(list{ii});
list = list{list{:}, B, C};
for jj=1:numel(list)-2
if(all(all(list{jj}==B)) || all(all(list{jj}==C)))
done = 1;
end
end
ii=ii+1;
end
end
更新:处理未知数量输出的更通用方法是修改myFunction
,使其输出单个单元格向量中的所有矩阵。通过这种方式,您可以通过以下方式连接列表:
[newMat] = myFunctions(list{ii}); % where newMat={B,C,...}
list = {list{:}, newMat{:}}; % or list=cat(2,list,newMat)
for jj=1:numel(list)-numel(newMat)
for nn=1:numel(newMat) % checking for repetitions
if(all(all(list{jj}==newMat{nn})))
done=1;
end
end
end
我想你要做的是二叉树递归。在不了解更多问题的情况下,很难给出一个好的解决方案,尤其是在不知道这个过程的输出是什么的情况下 我把这个加起来是为了举例说明你是如何做到这一点的。它不一定是最有效的,因为它存储了每个步骤的所有结果。给定一个输入矩阵A,它计算一个2-输出函数
[B,C]=MyFunction(A)
,并查找isequal(A,B)
或isequal(A,C)
。当这种情况发生时,它会输出该点的树深度,即在重复之前必须进行多少次迭代。带有全局变量的位只是为了我可以用一个简单的固定点做一个简单的例子(第k次迭代就是^k)。它将最多迭代10次
function depth = myRecursor(A)
global A_orig;
A_orig = A;
depth = 1;
max_depth = 10;
pvs_level = cell(1);
pvs_level{1} = A;
while depth < max_depth,
this_level = cell(2*length(pvs_level), 1);
for ix = 1 : length(pvs_level),
[B, C] = MyFunction(pvs_level{ix})
if isequal(B, A) || isequal(C, A),
return;
end
this_level{2*ix - 1} = B;
this_level{2*ix} = C;
end
depth = depth + 1;
pvs_level = this_level;
end
function [B, C] = MyFunction(A)
global A_orig;
B = A_orig*A;
C = 2*A;
函数深度=myRecursor(A)
全球起源;
A_orig=A;
深度=1;
最大深度=10;
pvs_级别=单元(1);
pvs_级{1}=A;
当深度<最大深度时,
该水平=单元(2*长度(pvs水平),1);
对于ix=1:长度(pvs_级),
[B,C]=MyFunction(pvs_级别{ix})
如果isequal(B,A)| | isequal(C,A),
返回;
结束
这个_级{2*ix-1}=B;
这个_级{2*ix}=C;
结束
深度=深度+1;
pvs_级别=此_级别;
结束
函数[B,C]=MyFunction(A)
全球起源;
B=A_orig*A;
C=2*A;
例如,
myRecursor(eye(2))
给出1(duh)和myRecursor([01;10])
给出2。您尝试了什么?哪一部分似乎不起作用?你需要保存每一步的输出吗?所以你想找到你函数的矩阵不动点?我的函数取一个矩阵a并输出它的“表兄妹”B和C。我想找到a的表兄妹,他们的表兄妹etcfixed点是a=f(a)。看起来更像极限环(但不完全相同)好的,我编辑了MyFunction代码以输出单元格数组而不是向量。我的主要问题是如何在概念上构造一个程序来迭代MyFunction的所有输出你应该能够使用单元格来迭代它,不是吗?我不太清楚你的意思。我对Matlab(一般来说是/编码)不熟悉,他没有所有的矩阵,它们是通过函数调用生成的。谢谢,这很有帮助。如果myFunction输出0、1、2或3个矩阵,那么最简单的修改方法是什么?谢谢-这在我看来比我习惯的更高级。我可能要花点时间才能弄明白