Effacer les filtres
Effacer les filtres

Evaluate many possible logical expressions

5 vues (au cours des 30 derniers jours)
Opt User
Opt User le 10 Juin 2017
Commenté : Walter Roberson le 11 Juin 2017
I have a set of binary variables: a,b,c... and a set of rules = { 'a or b', 'a or (b and c)', ... I need a fast way to determine the outcome of rules(i). Creating a truth table is not feasible because the number of binary variables is in the order of ~1000.
  8 commentaires
Opt User
Opt User le 11 Juin 2017
Yes, there is a list of variable names (a cell array of strings) and then there is a logical vector corresponding to the state of each of those variables. Furthermore, there is a list of logical rules expressed as strings which use the variable names. Given the logical vector of variable states, the goal is to find an efficient way to evaluate the outcome of each rule.
Walter Roberson
Walter Roberson le 11 Juin 2017
computation_function = matlabFunction(symbolic_expression_list, 'vars', {sym(CellArrayOfVariableNames)} );
result_for_this_vector = computation_function(this_vector_of_logical_values)

Connectez-vous pour commenter.

Réponse acceptée

Walter Roberson
Walter Roberson le 10 Juin 2017
If you have the symbolic toolbox, you can use sym() to parse the expressions, after which you could use matlabFunction to generate a function handle that can evaluate the expressions on inputs.
You will want to use the matlabFunction 'vars' option to control the order of the inputs; you might want to set it up to take the values as a vector, something like
matlabFunction(symbolic_expression, 'vars', {[a, b, c]}
If you are going to be repeating the calculations many times, you might want to go as far as to tell matlabFunction to write to a file: when it writes to a file then it defaults to optimizing the code, a process that takes a bit of time but might be worth it for repeated execution.
  3 commentaires
Opt User
Opt User le 10 Juin 2017
I think using regular expressions I can map each variable in the original string, to to a vector entry ('x[1] or x[2]') and that should do the trick. I will either use a cell of function handles, or like you said, write them down to files for faster performance. Thanks!
Walter Roberson
Walter Roberson le 11 Juin 2017
Modifié(e) : Walter Roberson le 11 Juin 2017
The syntax I showed,
matlabFunction(symbolic_expression, 'vars', {[a, b, c]}
will convert the names into indexes.
matlabFunction(sym('a | (b and c)'), 'vars', {[sym('a'),sym('b'),sym('c')]})
ans =
function_handle with value:
@(in1)in1(:,1)||(in1(:,2)&&in1(:,3))

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Data Type Identification dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by