我创建了一个函数(将其命名为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)等,直到它输出的矩阵开始重复。我知道这个过程必然会终止。
我在构建此代码时遇到了困难。任何建议都会非常感激。
答案 0 :(得分:1)
我认为你要做的是二叉树递归。在不了解问题的情况下很难提供一个好的解决方案,特别是在不知道你想要什么作为这个过程的输出的情况下。
我掀起了这个例子来说明你如何做到这一点。它不一定是最有效的,因为它存储了每一步的所有结果。给定输入矩阵A,它计算2输出函数[B, C] = MyFunction(A)
并查找isequal(A, B)
或isequal(A, C)
。当发生这种情况时,它会在该点输出树的深度,即在重复之前必须进行多少次迭代。具有全局变量的位是这样的,我可以用一个简单的固定点做一个简单的例子(第k次迭代只是A ^ 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(eye(2))
给出1(duh),myRecursor([0 1; 1 0])
给出2。
答案 1 :(得分:0)
我认为你应该使用细胞:
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
答案 2 :(得分:0)
编辑:重写了错误的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
UPDATE:处理未知数量输出的更通用方法是修改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