Проблема повторения функции с одним входом и двумя выходами в Matlab - PullRequest
0 голосов
/ 04 января 2012

Я создал функцию (назовите ее 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 ]

1 голос
/ 04 января 2012

Я думаю, что вы пытаетесь сделать рекурсию двоичного дерева. Трудно дать хорошее решение, не зная больше о проблеме, особенно не зная, что вы хотите получить в результате этого процесса.

Я поднял это, чтобы привести пример того, как вы могли бы сделать это. Это не обязательно самый эффективный, потому что он хранит все результаты на каждом этапе. Учитывая входную матрицу 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 (дух) и myRecursor([0 1; 1 0]) дает 2.

0 голосов
/ 04 января 2012

РЕДАКТИРОВАТЬ: переписано неправильно 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
0 голосов
/ 04 января 2012

Я думаю, вы должны использовать клетки:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...