Упростите число за цикл исчерпывающего поиска в Matlab - PullRequest
0 голосов
/ 09 июня 2018

Я хочу найти объективный результат, используя исчерпывающий поиск в Matlab.Допустим, у меня есть вектор / матрица 'x', как показано ниже:

x = [a b c;d e f]; a,b,c,d,e,f are Boolean (i.e., 0 or 1)

На основе 'x' у меня есть 2 ^ 6 решений.Как правило, мы можем использовать 'for loop' для решения этой проблемы:

for t1=0:1
   a = t1;
   for t2=0:1
      b = t2;
         .....
         for t6=0:1
            f = t6;
            g = a + ... + c + d + ... + f;
         end
       .....
    end
end

Однако было бы обременительно, если число элементов увеличится.Есть ли другой способ упростить зацикливание, не добавляя много «для цикла»?

1 Ответ

0 голосов
/ 09 июня 2018

Найдите количество элементов x, используя numel.Сгенерируйте все возможные комбинации в базе 10, используя оператор colon.Преобразуйте их в базовый 2-символьный вектор, используя dec2bin.Разделите их на отдельные двойные элементы, вычитая '0'.Теперь sum над вторым измерением, чтобы получить g.

g = sum(dec2bin(0:2^numel(x)-1)-'0', 2);

Обратите внимание, что по мере увеличения числа переменных потребуется больше памяти.например, в вашем примере с 30 переменными (30 таких переменных в рабочей области не очень хорошая идея), 8,2 ГБ памяти потребуется для g, и для обработки потребуется больше памяти.Вы можете сделать что-то вроде этого для такого случая:

g = repmat(uint8(0),1,2^numel(x));
for k = 0:2^numel(x)-1
    g(k+1) = sum(dec2bin(k)-'0', 2);
end

Но учтите, что uint8 имеет свои пределы (0-255)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...