Logical statement with variable gates and true/false vectors without using EVAL
    1 visualización (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Jurgens Wolfaardt
 el 31 de Oct. de 2017
  
    
    
    
    
    Comentada: Jurgens Wolfaardt
 el 31 de Oct. de 2017
            Hi All! Thank-you for help in advance.
I have a long logical statement of a dozen true/false vectors with eleven logical gates between them. The gates can have any one of the three values selected from:
     gate = {'&','|','&~'};
Let me use just two vectors and one gate for simplicity. If I use eval, it is a simple matter of concatenating a string...
tfvect1 = [0;1;0;1;1];
tfvect2 = [1;1;1;1;0];
gate = {'&','|','&~'};
n=1;
tf_result = eval(['tfvect1',gate{n},'tfvect2'])
but I want to avoid EVAL (aka 'EVIL') because I want to compile the code. This is actually the first time ever I've used EVAL, but I can't think of another way. STR2FUNC doesn't interpret a logical statement as valid, that is:
tfvect1 = [0;1;0;1;1];
tfvect2 = [1;1;1;1;0];
gate = {'&','|','&~'};
str='@(hit1,hit2,n)hit1 gate{n} hit2'
tf = str2func(str);
tf(tfvect1,tfvect1,1)
chokes on the logical statement (which MATLAB is happy with if you type it on the command line) - apparently STRFUNC only accepts algebraic statements.
Surely there is a better method than hard coding all the possible permutations of the logical statement? Any ideas please?
3 comentarios
  Walter Roberson
      
      
 el 31 de Oct. de 2017
				Sorry, the code is not parameterized by n. You would need different code for full expansion.
Respuesta aceptada
  Sean de Wolski
      
      
 el 31 de Oct. de 2017
        How about indexing into the function handles?
gate = {@and, @or, @(x,y)x&~y} %'&','|','&~'};
tfvect1 = [0;1;0;1;1];
tfvect2 = [1;1;1;1;0];
gateidx = [2 3 1];
for ii = numel(gateidx):-1:1
    tf(:, ii) = gate{gateidx(ii)}(tfvect1, tfvect2);
end
4 comentarios
Más respuestas (1)
  Walter Roberson
      
      
 el 31 de Oct. de 2017
        possible_gates = {'&','|','&~'};
andnot = @(a,b) a &~ b;
gatefuns = {@and, @or, andnot};
[~, gateidx] = ismember(gate, possible_gates);
current = gatefuns{gateidx(1)}(tfvect{1}, tfvect{2});
for K = 3 : length(tfvect);
  current = gatefuns{gateidx(K-1)}(current, tvfect{K});
end
0 comentarios
Ver también
Categorías
				Más información sobre Logical en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


