【问题标题】:Generate truth table in MatLab在 MatLab 中生成真值表
【发布时间】:2017-12-19 16:37:15
【问题描述】:

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

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

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

这是一个更大的项目的一部分,它需要 i 大。效率是一个问题。是否有更有效的代码来创建真值表? MatLab 是否具有执行此操作的内置函数?

编辑:抱歉格式化!

【问题讨论】:

  • 不幸的是,数学块的 $$ 在这里不起作用。通常代码块用反引号括起来,您可以使用代码按钮(它有 {})来做更大的块。
  • 谢谢!我仍然无法格式化矩阵。
  • @scrappedcola 或者您可以突出显示代码块并点击ctrl-k

标签: matlab coding-efficiency


【解决方案1】:

这样的?

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);

【讨论】:

  • 我认为您需要将d 行更改为d=[0:2^n-1].'; 除此之外,很好的答案!
  • 另外,dec2bin 有很多开销(检查变量类型等)。您可以使用T=rem(floor(d*pow2(1-n:0)),2); 加快速度,这正是dec2bin 实际所做的,而无需检查@MattT
  • @LuisMendo 当然你是对的......我的条件倒退了。
  • 这带来了一个有趣的点,n 不能太大,事实上它必须小于 31,否则你开始超出索引范围。
  • 更不用说内存了。对于n = 30,您将尝试生成一个 30GB 的矩阵。
【解决方案2】:

ndgrid 是你的好朋友:

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

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

我想这样的表现会很有竞争力。

>> 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

【讨论】:

  • 谢谢。 Paul 的原始代码大约是您的代码的两倍。 (秒 = 0.2796,而当 n = 20 时,秒 = 0.5771)。
  • 您使用的是什么版本?使用 R2015b 我的方法要快一个数量级(n=20)。更新了要显示的答案。
  • 看起来 Pauls 在 R2015b 中也更快,但仍然比使用 ndgrid 慢(大约 0.157037 秒)
  • 啊!我使用的是旧版本的 Matlab。您的解决方案是 R2015b 上三个解决方案中最快的。 @n=25,速度是 s=10.2, 11.5, 1.8(分别是 Paul,烧杯,你的)。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2010-10-31
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多