麻烦在Matlab上迭代一个输入和两个输出的函数

时间:2012-01-04 16:19:31

标签: 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)等,直到它输出的矩阵开始重复。我知道这个过程必然会终止。

我在构建此代码时遇到了困难。任何建议都会非常感激。

3 个答案:

答案 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