图像缩略图

君主

version 6.2.0.0 (3.32 KB) by 乔斯(10584)
重复,全部或子集的排列

76下载

更新2019年1月10日

查看版本历史记录

查看许可证

重复的烫入金
使用两个输入变量v和n,m = permn(v,n)返回所有
从向量V中取N个元素的重复排列。
v可以是任何类型的阵列(数字,小区等),m将是
如果V为空,或者N为0,则M为空。米有
尺寸Numel(v)。^ n-by-n。

当只需要这些排列的一个子集时,可以调用permn
使用3个输入变量:M = permn(V,N,K)只返回第K个
排列。输出与M = permn(V,N)相同;M = M (K,:)
但它避免了在有太多时可能发生的内存问题
组合。当您只需要几个时,这是秘密有用的
在给定时间的排列。如果V或K是空的,或者N是零,M会
是空的。M的大小是(K) × n。

[m,i] = permn(...)也返回索引矩阵i,以便m = v(i)。

例子:
M = permn([1 2 3],2) %返回9 × 2矩阵:
1 1
1 2
1 3.
2 1
2 2
2 3.
3 1
3 2
3 3.

m = permn([99 7],4)%返回16×4矩阵:
99 99 99
99 99 99 7
99 99 7 99
99 99 7 7
...
7 7 7 99
7 7 7 7

M = permn({'你好!' 1:3},2) %返回4 × 2单元格数组
'你好!''你好!'
'你好!'[1x3 double]
[1x3双]'你好!'
[1x3 double] [1x3 double]

V = 11:15, n = 3, k = [2 124 21 99]
M = permn(V, N, K) %返回4 × 3矩阵:
%11 11 12
%15 15 14
%11 15 11
%14 15 14
%是第2、124、21和99个排列
使用两个输入使用烫入率
M2 = permn(V,N);: isequal (M2 (K), M)
%注意M2是一个125 × 3的矩阵

可以使用%ermn生成二进制表,如
B = permn([0 1],5)

Nb矩阵大小以速率(n ^ n)* n指数增加。

另见烫发,nchoosek
Allcomb,Permpos上的文件交换

引用作为

乔斯(10584)(2021)。君主(//www.tatmou.com/matlabcentral/fileexchange/7147-permn), MATLAB中央文件交换。检索

评论和评级(82.

阿米尔Amini

Vedanta Agam.

Laura Lonetti

SUL MATLAB免费在线LA FUNZIONENONUC'ÉCERCO

阿里Komai

Nshine

弗洛伦特·Halgatte

rami skaff

安东的斯坦尼斯拉夫

Danielle Espinosa.

谢谢你:)

asif newaz.

VíctorMartínez-Cagigal

若昂桑托斯

m

谢谢,这很有帮助,很容易遵循!

保罗安全

Amaris Anderhan.

梁热热

伟大的!谢谢你。

WY6622

绝对精彩!谢谢

Sreehari Ramachandra Prabhu.

Hyunryung金

Stephen Cobeldick

FEX的最佳提交,应该是每个人的友好功能的集合。
写得非常好,高效,整洁的代码,综合帮助。正是在锡上说的。

Avik Sengupta.

舒瓦保罗

省时间!谢谢!:D:D

拉斐尔·奥利维拉

奥马尔kammouh.

我已经浪费了几个小时的尝试编码它,但很高兴我找到了你的代码。它救了我很多时间!非常感谢你 :)

Kesh Ikuma

克里斯蒂安·Mejia

骰子游戏维瑟

Ahmad Ziad Zain Aldeen

谢谢你,救了我的时间,谢谢!

Ahmad Ziad Zain Aldeen

亚历杭德罗杜兰

乔斯(10584)

@Cameron下载函数,解压到一个文件夹中,并将该文件夹添加到您的路径中。看文档

卡梅伦哈特曼

我是MatLab新手。有人能告诉我怎么在我自己的MatLab程序中调用它吗。

Kabiru akande.

mahmoud afifi

的国防

Matthew Daunt.

Farrukh佩尔韦兹•

一个非常快速的算法,用于找到排列。一个伟大的工作

Ceyhun Kirimli.

或作为一个完整的功能如下;

功能结果= SEQREP(v,n)
l =长度(v);
一个= 0 (l ^ N, N);
对于i = 1:n
(:,我)=重塑(重塑(repmat ((1: l), 1 l ^ (N - 1)), l ^我l ^ (N))”,l ^ N, 1);
结尾
结果= V (a);

Ceyhun Kirimli.

我猜这可以只使用1个循环完成,如下所示;

对于i = 1:n
a(:,i)=重塑(重塑(Repmat((1:l),1,l ^(n-1)),l ^ i,l ^(n-i))',l ^ n,1);
结尾

其中n=元素个数(这里是n)
l = v的长度

Mohsen Mansouryar

加ALBUJA

古格列尔莫fortuni

Triveni.

请帮我解决这个问题

A=[30 30 30 30 30 60 60 60 60 60 60 60 30 30 30 30 30 30 30 30];

[c, b] =嘘(A,独特的(A));
N =长度(一个);
x = ermn(b,n);%函数ermn.

我有矩阵A.我想要排序x。我需要C(1,1)的角度为30.和C(1,2)的角度为60.表示在每个排列中需要12个,其中60个。我该怎么办...请帮帮我。就像perm命令工作一样。但它仅限于10.我需要20。

我还有另一个程序,但它只适用于0和1。

A = [1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1];

n2 = numel(a);

b2 = nnz(一个);

m2 = 0:1:(1,n2)* pow2(n2-1:-1:0)';

Z2 = REM(楼层(M2(:)* POW2(1-N2:0)),2);

OUT = Z2(SUM(Z2,2)== B2,:);

乔斯(10584)

在第二次想法上,我也改变了这个名字。谢谢!

乔斯(10584)

我知道,斯蒂芬。我决定保留原始名称以便向后兼容。请注意,此功能超过10岁,仍然定期下载。
我将更新描述!

Stephen Cobeldick

此提交误导:

*如果订单无关紧要,它是一种组合。

*如果订单确实重要,它是一个排列。

从示例清楚的是,此提交会生成有时称为“与重复排列”的内容:

http://en.wikipedia.org/wiki/permolution.

如果此提交真正计算了组合,那么组{0,0,1},{0,1,0}和{1,0,0}都是等效的,并且并不存在于示例中所示的输出中。

http://en.wikipedia.org/wiki/Combination

http://mathworld.wolfram.com/combination.html.

或者简单地介绍一下:

https://www.mathsisfun.com/combinatorics/combinations-permutations.html

齐A.

有时救了我!

pangyuteng

Patrizio Manganiello

非常感谢你!

迈卡

非常有用,谢谢

重复组合,伟大!

乔斯(10584)

@MARC,感谢您的兴趣和改进的建议。然而,对于代码兼容性(和公平),您也需要实现到逆阶的步骤:-)

Marc Lalancette.

好的代码,谢谢!只是为了好玩,轻微到中速改善(对不起我的K =你的n):

%,而不是:
%[y {k:-1:1}] = ndgrid(x);
%Y =重塑(cat(k+1,Y{:}),[],k);
%填补Y直接:
nx = numel(x);
Y(nx ^ k,k)= x(1);%初始化以提供形状和数据类型。
s(1:k-1)= {ONE(1,NX)};
对于i = 1:k
Y(((I-1)* nx ^ k + 1):( i * nx ^ k))= x(s {1:i-1},:,s {i:k-1});
x = erfute(x,[1:i-1,i + 1,i]);
结尾
%这对组合具有较差的顺序,易于改变。

乔斯(10584)

@ Talaria,这是不可能的,因为它将需要(至少)150*(2^150)位的内存,大约是270000000000000000000000000000 tb…

但是,您不太可能立即需要所有这些组合;也许你可以想到你的问题的另一种方法,例如,通过一次绘制几个随机组合?

脚翼

工作很好,但有没有办法击败限制?例如,我希望能够返回以下内容:
M = combn ([0 1],150)
这可能吗?

欧文Brimijoin

这个功能的核心是一个可爱的小型计算宝石。谢谢你。

马努

优秀的快!

布拉德里脊

太好了,正是我需要的。谢谢!

法比奥

有没有人有一个想法如何创建像“combn”这样的函数,但是生成的矩阵仅包含单调行?通过在构建矩阵后删除非单调行可以手动进行,但是当矩阵的大小变为大时,我脱离了内存错误。任何的想法?

John d'Errico.

Oleg Komarov.

找不到更适合的H1线。整洁的帮助,简单的例子,历史记录(也许有关日期的更多细节......)和过去的算法。
我不是非常使用组合者,但我总是想知道为什么Matlab不覆盖它。必须拥有。

oleg.

1月

尼斯和comapct程序!H1线,帮助,历史,代码中的评论,高效。谢谢!

但可以更快地制作一点:
x = repmat({x},1,n);
[x {1:n}] = ndgrid(x {:});
x = pliplr(重塑(cat(n + 1,x {:}),[],n));
1.如果X以倒序填充[X{N:-1:1}],则可以省略FLIPLR =>比COMBN快25%(1:10,5)(参见我对ALLCOMB的评论)
2.内部NdGrid为每个输入执行相同的操作,但所有输入都相等。内联和简单地说明ndgrid导致(然后可以省略REPMAT):
C = cell(1, N);
x = x(:);
l =长度(x);
s(1:N - 1) = L;
x = RESHAPE(x(:,)(1,prod(s)),[l,s]);
C {N} = X;
对于iC = 2:N
c {n - ic + 1} = ympute(x,[2:Ic,1,Ic + 1:n]);
结尾
x =重塑(cat(n + 1,c {:}),[],n);
= > 40 - 50%速度更快。
令我惊讶的是,它会慢一个*立即创建输出阵列并直接插入允许的子阵列。

菲利普·L

Carlos Baiz.

谢谢!

何塞·卡塞雷斯

知道如何在不重复前面的组合的情况下获得组合,并且不重复使用选择中的元素吗?

Riccardo Bevilacqua

这正是我想要的!

Antonio Silva.

太感谢了!

阿N

做这份工作……

乔斯的作者

Roger Stafford指出,由于IEEE 754标准,浮点的地板(如COMBN算法所使用)可能导致非常具体的输入的错误结果。
该更新将其解决了这一潜在问题的优秀解决方案。谢谢罗杰!
更新(Combn 3.2)应该很快起来......

丹王

这是非常有用的,谢谢!

沃尔夫冈Zieroth

快速和(差不多)我需要什么!

...我只需要那些总和(例如)一个组合。当然,我可以首先使用此程序创建所有组合,然后找到(m * in(n,1)== 1)。然而,我非常快速地反对MATLAB的最大变量大小。有什么建议么?

ShenKae吴

非常感谢

VANGELIS R.

我很惊讶这不是内置功能。谢谢你救了我的命!

谢谢!正是我需要的。

PeterNavé.

我需要什么!

jürgenwomser-schütz

非常快!对解决我的实际问题很有帮助。

大卫·托雷斯

伟大的工具。使用方便。

理查德Vance

易于使用,快速,并适合纳入其他程序。良好的文档组织。它真的帮我解决了一些问题。

Yakir Gagnon.

乔斯vdG

杰米,使用Combn(唯一(v),n)

杰米-拜尔

做到了它的说法,但真的应该是将要素视为非唯一的选项。

MATLAB版本兼容性
创建R2018a
兼容任何释放
平台兼容性
窗户 macOS Linux.

社区宝藏狩猎

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!