NDGRID関数を使用してこのソリューションを検討してください。
sets = {[1 2], [1 2], [4 5]};
[x y z] = ndgrid(sets{:});
cartProd = [x(:) y(:) z(:)];
cartProd =
1 1 4
2 1 4
1 2 4
2 2 4
1 1 5
2 1 5
1 2 5
2 2 5
または、(変数を手動で作成することなく)任意の数のセットの一般的なソリューションが必要な場合は、次の関数定義を使用します。
function result = cartesianProduct(sets)
c = cell(1, numel(sets));
[c{:}] = ndgrid( sets{:} );
result = cell2mat( cellfun(@(v)v(:), c, 'UniformOutput',false) );
end
必要に応じて、結果を並べ替えることができます。
cartProd = sortrows(cartProd, 1:numel(sets));
また、上記のコードは、セットに重複する値がないかどうかをチェックしません(例:) {[1 1] [1 2] [4 5]}
。次の場合は、この1行を追加します。
sets = cellfun(@unique, sets, 'UniformOutput',false);