首页 > 解决方案 > 简化Matlab中穷举搜索的for循环次数

问题描述

我想在 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循环'来解决这个问题:

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

但是,如果元素的数量增加,这将是繁重的。有没有其他方法可以在不添加许多“for循环”的情况下简化循环?

标签: matlabfor-loop

解决方案


x求using的元素个数numel。使用运算符生成以 10 为底的所有可能组合colon。使用 . 将它们转换为以 2 为基数的字符向量dec2bin。通过减去将它们分隔为单独的双元素'0'。现在sum通过第二维得到g

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

请注意,随着变量数量的增加,将需要更多内存。例如,您的示例有 30 个变量(工作空间中的 30 个这样的变量不是一个好主意),需要 8.2 GB 内存,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)


推荐阅读