2011-06-04 3 views
0

J'ai écrit une fonction .oct à utiliser dans Octave qui ne donne pas le résultat que je m'attendais et je pense que le problème pourrait résider dans l'extrait de code donné ci-dessous - est-il correct d'imbriquer l'opérateur logique & & comme je l'ai fait ou doit-il être séparé en utilisant d'autres boucles internes?Logique imbriqué && opérateur permissibles?

if (((final_side_PDF > final_uwr_PDF && final_side_PDF > final_unr_PDF) && final_side_PDF > final_dwr_PDF) && final_side_PDF > final_dnr_PDF) 
    { 
    market_model(ii) = 0.0; 
    } 
else if (((final_uwr_PDF > final_side_PDF && final_uwr_PDF > final_unr_PDF) && final_uwr_PDF > final_dwr_PDF) && final_uwr_PDF > final_dnr_PDF) 
    { 
    market_model(ii) = 1.0; 
    } 
else if (((final_unr_PDF > final_side_PDF && final_unr_PDF > final_uwr_PDF) && final_unr_PDF > final_dwr_PDF) && final_unr_PDF > final_dnr_PDF) 
    { 
    market_model(ii) = 2.0; 
    } 
else if (((final_dwr_PDF > final_side_PDF && final_dwr_PDF > final_uwr_PDF) && final_dwr_PDF > final_unr_PDF) && final_dwr_PDF > final_dnr_PDF) 
    { 
    market_model(ii) = -1.0; 
    } 
else if (((final_dnr_PDF > final_side_PDF && final_dnr_PDF > final_uwr_PDF) && final_dnr_PDF > final_unr_PDF) && final_dnr_PDF > final_dwr_PDF) 
    { 
    market_model(ii) = -2.0; 
    } 
else 
    { 
    market_model(ii) = market_model(ii-1); 
    } 

Modifier en réponse aux commentaires

Je souhaite vérifier que l'un des cinq variables; final_side_PDF, final_uwr_PDF, final_unr_PDF, final_dwr_PDF et final_dnr_PDF; a la plus grande valeur et renvoie un numéro d'identification unique; 0,1,2, -1, -2; en fonction de laquelle est le max. Le code ci-dessus est contenu dans une boucle principale (ii).

+0

Il est OK, vous utilisez "imbriqué' && '", mais nous ne pouvons pas vous aider sans connaître plus de détails. En utilisant 'if-else if-else if -..- else' est très différent de' if ..; si..; ... '. Dépend de ce que vous essayez de faire (: –

+3

Je pense que votre code a besoin de refactorisation .. il y a plusieurs contrôles relationnels qui pourraient facilement être regroupés ce qui conduirait à beaucoup plus de code plus clair – Xeo

+1

Le code que vous avez posté fait ce que vous avez spécifié L'une des choses que vous pouvez essayer est de mettre entre parenthèses chaque vérification final_xx_side> final_yy_size' Les règles de priorité d'opérateur indiquent que '>' est évalué avant '&&' mais j'ai rencontré au moins un compilateur – mtrw

Répondre

2

Suggestion:

typedef int final_t; 

// From your code I assume that "final_xx" can have the same values, otherwise a std::map would be simpler. 
std::multimap<final_t, double> finals; 

finals.insert(std::make_pair(final_side_PDF, 0.0)); 
finals.insert(std::make_pair(final_uwr_PDF, 1.0)); 
finals.insert(std::make_pair(final_unr_PDF, 2.0)); 
finals.insert(std::make_pair(final_dwr_PDF, -1.0)); 
finals.insert(std::make_pair(final_dnr_PDF, -2.0)); 

auto max_final = finals.rbegin(); 

if(finals.count(max_final->first) == 1) 
    masket_model(ii) = max_final->second; 
else 
    market_model(ii) = market_model(ii-1); 

Si "final_xx" tous ont des valeurs uniques que vous pouvez le rendre encore plus simple:

typedef int final_t; 

std::map<final_t, double> finals; 

finals[final_side_PDF] = 0.0; 
finals[final_uwr_PDF] = 1.0; 
finals[final_unr_PDF] = 2.0; 
finals[final_dwr_PDF] = -1.0; 
finals[final_dnr_PDF] = -2.0; 

auto max_final = finals.rbegin(); 

market_model(ii) = max_final->second; 
+0

Oui, il est possible que deux valeurs "final_xx" soient identiques, d'où la valeur par défaut "market_model (ii) = market_model (ii-1);" dans ce cas, , J'aime ta suggestion. – babelproofreader

Questions connexes