Filter löschen
Filter löschen

Evaluate many possible logical expressions

5 Ansichten (letzte 30 Tage)
Opt User
Opt User am 10 Jun. 2017
Kommentiert: Walter Roberson am 11 Jun. 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 Kommentare
Opt User
Opt User am 11 Jun. 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 am 11 Jun. 2017
computation_function = matlabFunction(symbolic_expression_list, 'vars', {sym(CellArrayOfVariableNames)} );
result_for_this_vector = computation_function(this_vector_of_logical_values)

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 10 Jun. 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 Kommentare
Opt User
Opt User am 10 Jun. 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 am 11 Jun. 2017
Bearbeitet: Walter Roberson am 11 Jun. 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))

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Data Type Identification finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by