3

我有一个一维元胞数组 Z。Z 的每个元胞都包含一个向量。例如:

Z{1} = [1 2];
Z{2} = [3 4 5];
Z{3} = [6];
...
Z{length(Z)} = [10 11 12 13];

这些向量的大小都是不同的。我想要做的是将所有可能组合的函数值的总和与每个 Z{i} 中的一个元素进行比较。那就是我想比较以下所有组合:

func(1) + func(3) + func(6) + ...
func(1) + func(4) + func(6) + ...
func(1) + func(5) + func(6) + ...
func(2) + func(3) + func(6) + ...
func(2) + func(4) + func(6) + ...
func(2) + func(5) + func(6) + ...
...
...

我想知道哪种组合产生的最大值。

我怎样才能聪明地做到这一点?越聪明越好。但我也在寻找任何工作代码。问题规模会很小。

注意:本例中使用的实际值,1、2、3、4、5、6、...只是示例。他们没有任何特定的模式。

4

1 回答 1

2

考虑以下解决方案,它有一个循环,但它会按时间线性而不是指数地执行您想要的操作。

迭代地,该算法在所有行中运行,在行Z的条目中生成所有可能的路径Z{i}。尽管如此,每个条目只解析一次,因此可以节省复杂性。

 N = 3;

 Z = cell(1,N);

 Z{1} = [1 2];
 Z{2} = [3 4 5];
 Z{3} = [6];

 f = @(x) x.^2;  %% Test function



disp('init')
res = arrayfun(f,(Z{1}))     %% Init step. Image of Z{1}
for i = 2 : N
   disp(i)      %% just to have an idea of where you are in the process
   disp(res)

   t = bsxfun(@plus,res,arrayfun(f,(Z{i}))')  %In a tensor way you build all
                                              %the possible sum of the res and f(Z{i})
                                              %making all paths.
   res = reshape(t,1,[])                      %You put the tensor sum on a single
                                              %row to be able to iterate.  
   disp('END step-------')
end

用正方形测试

res =

46    53    62    49    56    65

例如46 = 1^2 + 3^2 + 6^249 = 2^2 + 3^2 + 6^2...

到目前为止,我不确定您是否可以完全避免循环。我在这里所做的是动态构建解决方案,在每次迭代中添加一个单元格元素。

张量求和技术(t = bsxfun(@plus,res,arrayfun(f,(Z{i}))'))来自this answer

于 2012-11-17T17:55:50.777 回答