2017-02-15 2 views
-1

Mon objectif: Selon le scénario prédominant dans chaque ligne, effectuez le calcul suivant l'instruction if. Le résultat final doit être 1 colonne, y compris le résultat de chaque ligne calc.Calculs sur des paires de cellules répondant à plusieurs critères prédéfinis?

Ce que j'ai essayé jusqu'à présent:

CalcOutcome = zeros(554,1); 
    for k=height(MomPF) 
     if MomPF.L_sum4t<0 & MomPF.U_sum4t>0   
      % make calc for every row but end result should only be 1 column 
      % with the calc outcomes 
      CalcOutcome=(-1)*MomPF.L_sum4t{k}*0.5 + MomPF.U_sum4t{k}*0.5; 
     elseif MomPF.L_sum4t<0 & MomPF.U_sum4t<0 
      CalcOutcome=(-1)*MomPF.L_sum4t{k}*1; 
     elseif MomPF.L_sum4t>0 & MomPF.U_sum4t>0 
      CalcOutcome=MomPF.U_sum4t{k}*1; 
     elseif MomPF.L_sum4t>0 & MomPF.U_sum4t<0 
      CalcOutcome=MomPF.L_sum4t{k}*0.5 + (-1)*MomPF.U_sum4t{k}*0.5; 
     elseif MomPF.L_sum4t==0 & MomPF.U_sum4t==0 
      CalcOutcome=0   
     end 
    end 

Tableau: enter image description here

+0

Quelle est votre question? – excaza

+0

@excaza, voir ci-dessus (section objectif) – John

+3

Une question se termine généralement par un point d'interrogation. (S'il vous plaît ne pas ajouter "Comment puis-je atteindre cet objectif?". [This] (http://stackoverflow.com/help/how-to-ask) pourrait aider.) – dasdingonesin

Répondre

1

Comme d'autres l'ont mentionné, il semble que l'indexation soit le problème. Cela dit, vous n'avez pas besoin de boucler - vous devriez être capable de faire tout cela en même temps avec l'indexation des tables. Par exemple, quelque chose comme:

idx = (MomPF.L_sum4t < 0) & (MomPF.U_sum4t > 0); CalcOutcome(idx) = -0.5*MomPF.L_sum4t(idx) + 0.5*MomPF.U_sum4t(idx);

Et puis rincez et répétez l'opération pour les autres conditions.

+0

merci beaucoup! Je fais exactement ce que j'ai l'intention de faire après avoir répété pour les autres cas. – John

1

Je n'avez pas vos données à tester, mais je dirais que vous avez oublié d'index!

CalcOutcome = zeros(554,1); 
    for k=height(MomPF) 
     if MomPF.L_sum4t(k)<0 & MomPF.U_sum4t(k)>0   
      % make calc for every row but end result should only be 1 column 
      % with the calc outcomes 
      CalcOutcome(k)=(-1)*MomPF.L_sum4t(k)*0.5 + MomPF.U_sum4t(k)*0.5; 

     elseif MomPF.L_sum4t(k)<0 & MomPF.U_sum4t(k)<0 
      CalcOutcome(k)=(-1)*MomPF.L_sum4t(k)*1; 

     elseif MomPF.L_sum4t(k)>0 & MomPF.U_sum4t(k)>0 
      CalcOutcome(k)=MomPF.U_sum4t(k)*1; 

     elseif MomPF.L_sum4t>(k)0 & MomPF.U_sum4t(k)<0 
      CalcOutcome(k)=MomPF.L_sum4t(k)*0.5 + (-1)*MomPF.U_sum4t(k)*0.5; 

     elseif MomPF.L_sum4t(k)==0 & MomPF.U_sum4t(k)==0 
      CalcOutcome(k)=0   
     end 
    end 

Vous parcourez k, utilisez-le.

+0

c'est ce que j'ai essayé en premier, mais les erreurs suivantes sont survenues, donc j'ai laissé tomber les '{k}' s dans les instructions if 'Référence de contenu de cellule d'une non-cellule objet tableau. Erreur dans matlab.internal.table.numArgumentsFromSubscriptRecurser (ligne 7) n = numArgumentsFromSubscript (a, s, ctxt); erreur sous forme de tableaux/numArgumentsFromSubscript (ligne 61) sz = matlab.internal.table.numArgumentsFromSubscriptRecurser (x, s (2: end), contexte); ' – John

+1

Sur la base de la capture d'écran fournie,' MomPF.L_sum4t' est pas une cellule, donc vous ne pouvez pas indexer son contenu avec des accolades. Vous voulez des accolades régulières: 'MomPF.L_sum4t (k)'. – CKT

+1

@John ......... C'est une chose complètement différente que ce que vous avez demandé. Et c'est parce que '{k}' -> '(k)'. Essayez l'édition en cours. Pour référence future, prenez votre temps pour lire [ask], et très important, [mcve] –