2016-02-10 2 views
0

Я написал функцию (назовите ее F), которая работает «хорошо» (то есть дает мне результат, который я хочу), и внутри него я вызываю ту же самую функцию (назовите ее G_i) четыре раза (ниже одного из них), за исключением того, что каждый раз я изменяю способ индексирования своего цикла, чтобы иметь возможность охватить все пары коэффициентов в матрице. Я думаю, что этот метод плох, и я хотел бы знать, есть ли у вас идеи его улучшить ...Умный способ индексирования петель в Matlab

Я делаю это, чтобы проверить последовательные условия на коэффициенты матрицы (иногда в порядке (1,2) то (1,3) тогда (2,3). Я продолжаю проверять разные порядки).

function G_1=countbackward(a,,,) 
n=a; 
G_1=[]; 


N=1; 
while N>0  
for l=n:-1:1 
    for m=1:l 

     if some condition on generated matrices 
     ... 

     elseif another condition on generated matrices 
     ... 

     else 
      N=0 ; 
     end 
     G_1=[G_1,g_0] ; 
    end 

end 

конец

(при п = 3 я получаю с выше записей:. (3,1), (3,2), (2,1))

Другие индексации Я использую с точно таким же телом выше функции:

for l=n:-1:1 
    for m=(l-1):-1:1 

То же самое для следующего:

for l=1:n 
    for m=l+1:n 

То же самое для следующего:

for l=1:n 
    for m=n:-1:l 

Спасибо за вашу помощь.

ПРИЛОЖЕНИЕ:

Ниже приведен упрощенный пример моего кода:

function H=count2backward(a,g_0,s,e) 
%matrix g_0 is the "start" matrix 
%matrix g_K is the "end" matrix 

n=a; % number of nodes in an undirected graph or size A 
s=mypayoff(n,g_0); 
e=mypayoff(n,g_K); 

H=[]; 


N=1; 
while N>0  
for l=1:n 
    for m=n:-1:l 

     if l~=m && g_0(l,m)==0 && s(l)<=e(l) && s(m)<=e(m) && (s(l)<e(l) || s(m)<e(m)) ; 
      g_0(l,m)=g_0(l,m)+1 ; 
      g_0(m,l)=g_0(m,l)+1 ; 
      g_0 ; 

      s=mypayoff(n,g_0); 

     elseif l~=m && g_0(l,m)==1 && (s(l)<e(l) || s(m)<e(m)) ; 
      g_0(l,m)=g_0(l,m)-1 ; 
      g_0(m,l)=g_0(m,l)-1 ; 
      g_0 ; 

      s=mypayoff(n,g_0); 

     else 
      N=0; 

     end 
     H=[H,g_0] ; 
    end 

end 

конец

+0

http://stackoverflow.com/help/mcve –

+0

спасибо, я могу дать полный код, но даже в моих условиях я называю другие функции, которые я написал .. @transversalitycondition – Sha

+1

точка, чтобы попытаться построить простой пример, иллюстрирующий абстрактный пункт, чтобы ваш вопрос был полезен для других участников. чем больше усилий вы вкладываете в свой вопрос, тем больше усилий вы можете ожидать в ответ :) –

ответ

1

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

indexes = countbackwardpattern(a); 
G_1=g_i(a, indexes); 
+0

фантастический! прекрасно работает – Sha

Смежные вопросы