在数学中经常会遇到一个问题:对于给定的多个集合,写出他们元素的所有排列组合。利用枚举法,很容易手写出来,但是编程时,如何快速实现这一功能呢?我们给出快速解决这一问题的MATLAB代码。

ce7339901585d5cd55f18d92c6b0bb8a.png

问题:

1、假设给定一个cell数组,生成一个矩阵,每行的第i个位置为第i个元胞中元素。

% A是一个元胞数组,第一个元素为向量[1 2 3],第二个元素为向量[2 4 7]A = {1:3, [2 4 7]};  

最简单的方法就是利用for循环,但是效率比较低,并且元胞数比较多的时候,太多层的for循环,也不美观。下面给出一种简单的方法,避免使用for循环。

程序代码:

% 使用ndgrid生成N维网格数据n = length(A); % 确定A有多少个元胞S=arrayfun(@(i)sprintf('x%i ',i),1:n,'UniformOutput',false);eval(['[' S{:} ']=ndgrid(C{:});'])S1=arrayfun(@(i)sprintf('x%i(:) ',i),1:n,'UniformOutput',false); % 把网格数据转换为坐标组合X = eval(['[' S1{:} ']']);

运行结果为

     1     2     2     2     3     2     1     4     2     4     3     4     1     7     2     7     3     7

2、对于集合{1,2,...,m},生成从集合中取n个数的所有组合

例如:m=3,n=2,即:S为集合{1,2,3},生成从S中取2个数的所有组合。

同样的为了避免循环,我们利用ngrid函数实现其求解。

方法一:直接利用上面算法即可,只需将A值改变即可。程序代码:

% A是一个元胞数组,第一个元素为向量[1 2 3],第二个元素仍为向量[1 2 3]A = {1:3, 1:3};

继而调用1中的代码即可。

方法二:程序代码

[x1,x2] = ndgrid(1:3);Index = [x2(:) x1(:)]

结果为:

     1     1     1     2     1     3     2     1     2     2     2     3     3     1     3     2     3     3

还需进行处理,去掉重复的元素,例如[1 2]和[2 1],这可以通过sort处理。此处省略。


我是杂谈博士,闲暇之余爱看电影、爱好运动、爱好编程、爱好旅游,更热爱算法,如果也有契合你的地方,关注我吧!

2d4972ed72144a1e5912806f17d5c1c3.png
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐