matlab eval函数_MATLAB编程技巧:如何生成多个集合的全部排列、组合
在数学中经常会遇到一个问题:对于给定的多个集合,写出他们元素的所有排列组合。利用枚举法,很容易手写出来,但是编程时,如何快速实现这一功能呢?我们给出快速解决这一问题的MATLAB代码。问题:1、假设给定一个cell数组,生成一个矩阵,每行的第i个位置为第i个元胞中元素。% A是一个元胞数组,第一个元素为向量[1 2 3],第二个元素为向量[2 4 7]A = {1:3, [2 4 7]};最简..
在数学中经常会遇到一个问题:对于给定的多个集合,写出他们元素的所有排列组合。利用枚举法,很容易手写出来,但是编程时,如何快速实现这一功能呢?我们给出快速解决这一问题的MATLAB代码。
问题:
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处理。此处省略。
我是杂谈博士,闲暇之余爱看电影、爱好运动、爱好编程、爱好旅游,更热爱算法,如果也有契合你的地方,关注我吧!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)