3

1次元のセル配列Zがあります。Zの各セルにはベクトルが含まれています。例えば:

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

これらのベクトルのサイズはすべて異なります。私がやりたいのは、すべての可能な組み合わせの関数値の合計を、各Z{i}の1つの要素と比較することです。つまり、次のすべての組み合わせを比較したいと思います。

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を作成します。それでも、各エントリは1回だけ解析されるため、複雑さを軽減できます。 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..。

これまでのところ、サイクルを完全に回避できるかどうかはわかりません。ここで行うことは、反復ごとにセルの1つの要素を追加するソリューションを動的に構築することです。

この回答からのテンソル総和手法(t = bsxfun(@plus,res,arrayfun(f,(Z{i}))'))。

于 2012-11-17T17:55:50.777 に答える