matlab排列组合程序

matlab排列组合程序,第1张

A=[3 5 9]

B=[11 14 17 19]

C=[21 23 27]

D=[30 32 33]

a=nchoosek(1:3,2)

b=nchoosek(1:4,2)

c=nchoosek(1:3,1)

[ma na]=size(a)

[mb nb]=size(b)

[mc nc]=size(c)

r=[]

for i=1:ma

for j=1:mb

for k=1:ma

for p=1:mc

r=[rA(a(i,:)) B(b(j,:)) C(a(k,:)) D(c(p,:))]

end

end

end

end

第一题链仿程序

1-nchoosek(51,18)/nchoosek(54,18)

结果:0.7121

第二题程序:

3^18/nchoosek(54,18)

结谈唤颂果含郑:3.9971e-006

楼上的答案是正确的,但存在一些小问题:

1、循环到55555是没道理的,应该到33333,因为最大值只可能是33333。

2、程序效率太低,在我的电脑上运行需要几十秒。可以进一步优化,把效率提高几倍是可能的。

========

我的做法:

========

我这里提供一种更简单的方法,一共只需要3行代码,而且效率极高,只需要大约0.02秒:

[a,b,c,d,e]=ndgrid(0:3)

x=a(:)+b(:)*10+c(:)*10^2+d(:)*10^3+e(:)*10^4

x(any(int2str(x)=='0',2))=[]

==============

程序的基本思想:

==============

考虑5位数,各位数字只可能是0~3,而且0只能出现在前面(把不足五位的看作前面的数字是0)。所以,用ndgrid生成五位数的各位,并加到一起得到五位数,然后考虑到数字中不能出现0,将其转换为字符串之后再删掉含有0的数字即可(用到any和int2str函数)。

==========

得到的结果:

==========

>>x

x =

           1

           2

           3

          11

          12

          13

     辩首盯     21

          22

          23

          31

          32

          33

         111

    携和     112

         113

(限于篇幅,中间删除部分行)

       33311

       33312

  芹亩     33313

       33321

       33322

       33323

       33331

       33332

       33333

>>whos x

  Name      Size                   Bytes  Class

  x       363x1                     2904  double array


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12479819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存