Logical statement with variable gates and true/false vectors without using EVAL
3 次查看(过去 30 天)
显示 更早的评论
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 个评论
Walter Roberson
2017-10-31
Sorry, the code is not parameterized by n. You would need different code for full expansion.
采纳的回答
Sean de Wolski
2017-10-31
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
更多回答(1 个)
Walter Roberson
2017-10-31
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 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Startup and Shutdown 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!