Вот еще одно решение:
%# generate all possible version of first half
h1 = num2cell(-(dec2bin(1:15)-'0'),2);
%# generate all possible version of second half
h2 = arrayfun(@(i) unique(perms([zeros(1,4-i) ones(1,i)]),'rows'), (1:4)', 'UniformOutput',false);
%'# number of 1s in each row of h1
n = -cellfun(@sum, h1);
%# get final result by combining h1 and h2
B = cellfun(@(a,b) [repmat(a,size(b,1),1) b], h1, h2(n), 'UniformOutput',false);
B = cell2mat(B);
Результат:
B =
0 0 0 -1 0 0 0 1
0 0 0 -1 0 0 1 0
0 0 0 -1 0 1 0 0
0 0 0 -1 1 0 0 0
0 0 -1 0 0 0 0 1
0 0 -1 0 0 0 1 0
0 0 -1 0 0 1 0 0
0 0 -1 0 1 0 0 0
0 0 -1 -1 0 0 1 1
0 0 -1 -1 0 1 0 1
0 0 -1 -1 0 1 1 0
0 0 -1 -1 1 0 0 1
0 0 -1 -1 1 0 1 0
0 0 -1 -1 1 1 0 0
0 -1 0 0 0 0 0 1
0 -1 0 0 0 0 1 0
0 -1 0 0 0 1 0 0
0 -1 0 0 1 0 0 0
0 -1 0 -1 0 0 1 1
0 -1 0 -1 0 1 0 1
0 -1 0 -1 0 1 1 0
0 -1 0 -1 1 0 0 1
0 -1 0 -1 1 0 1 0
0 -1 0 -1 1 1 0 0
0 -1 -1 0 0 0 1 1
0 -1 -1 0 0 1 0 1
0 -1 -1 0 0 1 1 0
0 -1 -1 0 1 0 0 1
0 -1 -1 0 1 0 1 0
0 -1 -1 0 1 1 0 0
0 -1 -1 -1 0 1 1 1
0 -1 -1 -1 1 0 1 1
0 -1 -1 -1 1 1 0 1
0 -1 -1 -1 1 1 1 0
-1 0 0 0 0 0 0 1
-1 0 0 0 0 0 1 0
-1 0 0 0 0 1 0 0
-1 0 0 0 1 0 0 0
-1 0 0 -1 0 0 1 1
-1 0 0 -1 0 1 0 1
-1 0 0 -1 0 1 1 0
-1 0 0 -1 1 0 0 1
-1 0 0 -1 1 0 1 0
-1 0 0 -1 1 1 0 0
-1 0 -1 0 0 0 1 1
-1 0 -1 0 0 1 0 1
-1 0 -1 0 0 1 1 0
-1 0 -1 0 1 0 0 1
-1 0 -1 0 1 0 1 0
-1 0 -1 0 1 1 0 0
-1 0 -1 -1 0 1 1 1
-1 0 -1 -1 1 0 1 1
-1 0 -1 -1 1 1 0 1
-1 0 -1 -1 1 1 1 0
-1 -1 0 0 0 0 1 1
-1 -1 0 0 0 1 0 1
-1 -1 0 0 0 1 1 0
-1 -1 0 0 1 0 0 1
-1 -1 0 0 1 0 1 0
-1 -1 0 0 1 1 0 0
-1 -1 0 -1 0 1 1 1
-1 -1 0 -1 1 0 1 1
-1 -1 0 -1 1 1 0 1
-1 -1 0 -1 1 1 1 0
-1 -1 -1 0 0 1 1 1
-1 -1 -1 0 1 0 1 1
-1 -1 -1 0 1 1 0 1
-1 -1 -1 0 1 1 1 0
-1 -1 -1 -1 1 1 1 1