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
EDIT: используйте изменение формы вместо разыменования столбца для дальнейшего повышения производительности.
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
person
Andy Campbell
schedule
04.09.2015
ctrl-k
- person beaker   schedule 04.09.2015