2011-02-03 4 views
5

B est une matrice [1x8] qui peut également être considéré comme deux moitiés comme suit:combinaison linéaire d'une matrice/vecteur

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

Ici il peut y avoir une, deux, trois ou quatre -1 s » dans la première moitié, et il devrait y avoir un nombre égal de 1 dans la seconde moitié. Cela devrait être fait en combinaisons linéaires.

Par exemple, s'il y a deux -1 « s au premier semestre, ils peuvent être placés dans 4 choose 2 = 6 manières, et pour chacun d'eux, il y aura 6 façons de placer les deux 1 » s dans la seconde moitié. Donc, le système a un total de 6 * 6 = 36 façons. c'est-à-dire 36 valeurs différentes pour les B s'il y a deux -1 dans la première moitié.

Comment est-ce que je peux faire ceci?

+0

Voulez-vous dire que vous voulez produire tous les vecteurs possibles (ie 16 + 36 + 16 + 1 = 69) selon ta définition? – MartinStettner

+0

Oui. La réponse de Jonas était juste. –

Répondre

5

Vous pouvez d'abord générer toutes les permutations possibles de uns et de zéros, puis éliminer les permutations superflues.

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

Chaque ligne de allB est une valeur possible pour B

+0

Parfait. Merci :) –

+0

procéder par élimination est certainement plus facile ici +1 – Amro

+0

Wow, excellente solution. +1 – zellus

2

Voici une autre solution:

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

Le résultat:

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

Votre solution est également correcte. Pourriez-vous également jeter un coup d'oeil à mon autre question similaire. http://stackoverflow.com/questions/4890768/generating-linear-combination-of-a-matrix –