在MatLab中生成真值表

时间:2015-09-03 20:37:18

标签: matlab coding-efficiency

我想在MatLab中用i列和i 2 行创建一个真值表。例如,如果i = 2,那么

T = 
[0  0] 
[1  0] 
[0  1] 
[1  1]

执行此操作的代码已创建here

这是一个大型项目的一部分,需要我很大。效率是一个问题。是否有更高效的代码来创建真值表? MatLab有内置功能吗?

编辑:抱歉格式化了!

3 个答案:

答案 0 :(得分:3)

这样的东西?

n=2;
d=[0:2^n-1].';

T=dec2bin(d,n)

T =

00
01
10
11

dec2bin将为您提供一个字符数组,如果需要,您可以将其转换为逻辑数组。还有de2bi可以直接为您提供数值数组,但是您需要更新版本的Matlab,并且这些位的顺序是相反的。

此处Luis Mendo's加速,复制dec2binnd如上所述):

T=rem(floor(d*pow2(1-n:0)),2);

答案 1 :(得分:1)

ndgrid是你的朋友:

>> truthTable(2)

ans =

     0     0
     1     0
     0     1
     1     1

>> truthTable(4)

ans =

     0     0     0     0
     1     0     0     0
     0     1     0     0
     1     1     0     0
     0     0     1     0
     1     0     1     0
     0     1     1     0
     1     1     1     0
     0     0     0     1
     1     0     0     1
     0     1     0     1
     1     1     0     1
     0     0     1     1
     1     0     1     1
     0     1     1     1
     1     1     1     1

>> 
>> timeit(@() truthTable(20))

ans =

        0.030922626777

首先,您需要为真值表中的维数创建网格。一旦你有了它们你可以列出它们来获得你需要的列向量,你可以水平连接这些列向量来获得你的真值表。

我认为这种表现非常具有竞争力。

function t = truthTable(n)
dims = repmat({[false, true]}, 1, n);
[grids{1:n}] = ndgrid(dims{:});
grids = cellfun(@(g) reshape(g,[],1), grids, 'UniformOutput',false);
t = [grids{:}];


>> timeit(@() truthTable(20))

ans =

        0.016237298777

编辑:使用重塑而不是列解除引用来进一步提高性能

powerset

答案 2 :(得分:0)

我知道这个问题已经死了一段时间,但我想知道同样的事情并找到了我喜欢的解决方案。以为我会在这里分享:

fullfact(ones(1, i) + 1) - 1