2011-02-03 24 views
5

B oznacza grupę [1x8] matrycy, który może być uważany jako dwie połówki, jak następuje:kombinacji liniowej matrycy/wektor

B = -1 -1 0 0 0 0 1 1 

Tutaj może być jeden, dwa, trzy lub cztery -1'S w pierwszej połowie i powinna być równa liczba 1 w drugiej połowie. Powinno to odbywać się w liniowych kombinacjach.

Na przykład, jeśli dwa -1 „S w pierwszej połowie, mogą one być umieszczone w 4 choose 2 = 6 sposób, a dla każdego z nich będzie 6 sposób, aby umieścić dwie 1” S w drugiej połowie. Tak więc system ma w sumie 6 * 6 = 36 sposobów. tj. 36 różnych wartości dla B, jeśli w pierwszej połowie są dwa -1.

Jak mogę to zrobić?

+0

Czy to znaczy, że chcesz produkować wszystkie możliwe (tzn. 16 + 36 + 16 + 1 = 69) wektory według twojej definicji? – MartinStettner

+0

Tak. Odpowiedź Jonasa była słuszna. –

Odpowiedz

5

Najpierw można wygenerować wszystkie możliwe permutacje zer i jedynek, a następnie wyrzucić te zbędne.

%# make permutations using dec2bin (start from 17 since it's the first solution) 
allB = str2double(num2cell(dec2bin(17:255))); 

%# change sign in the first half, then check that the total is ok 
allB(:,1:4) = - allB(:,1:4); 
allB = allB(sum(allB,2)==0,:); 

Każdy wiersz allB jest możliwa wartość dla B

+0

Idealny. Dzięki :) –

+0

postępowanie przez eliminację jest zdecydowanie łatwiejsze tutaj +1 – Amro

+0

Wow, świetne rozwiązanie. +1 – zellus

2

Oto inne rozwiązanie:

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

Rezultat:

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

Twoje rozwiązanie jest również poprawne. Czy możesz też rzucić okiem na moje podobne inne pytanie. http://stackoverflow.com/questions/4890768/generating-linear-combination-of-a-matrix –