MATLAB中的元素组合

时间:2019-02-04 15:17:46

标签: matlab

我有一个问题,我需要构建一个函数,该函数的输出是一个元素的所有可能组合的矩阵,该元素仅重复一次,而另一个元素可以是一个或多个。

例如,假设我们有一个尺寸为3 x 1的数组y,其初始化为[0 0 0],则第一个元素是x,它被重复一次,而第二个元素r,被重复一个或多个。因此,我需要构建的结果矩阵将类似于该矩阵:

y = [x r 0; 
     x 0 r;
     x r r;
     r x 0;
     0 x r;
     r x r;
     r 0 x;
     0 r x;
     r r x]

我尝试使用nchoosek,但这不起作用,因为当我有[x r 0]时,我就没有[x 0 r]。

我尝试了排列的示例,但是根据上述矩阵,我现在不能将x放在3的位置,将r放在0的位置

clear all 
clc 

v = 1 : 3; 
vv = perms(v); 
vv(vv<3)=0;

请帮忙。

谢谢

1 个答案:

答案 0 :(得分:1)

您遇到了一个棘手的问题。这是我解决的方法:

  1. 假设您有2个rr1r2
  2. 计算所有排列
  3. 删除等效项(其中r1代替r2,反之亦然)
  4. 删除不喜欢的人(没有x的人)

最后,您将其设置为“代码模式”,只需将数字替换为相应的变量即可。我相信你能弄清楚;)

% Code is:
% x=1
% r=2
% r=3
% 0=4
nk=nchoosek(1:4,3);

% compute all permutations
fullperms=[];
for ii=1:size(nk,1)
    fullperms=[fullperms; perms(nk(ii,:))];
end

% Remove the ones that are "the same" (we have 2 r)
% eg
% [1 2 4] and [1 3 4]
fullpermsaux=fullperms;
fullpermsaux(fullpermsaux==2)=3;
[~,ia,~]=unique(fullpermsaux,'rows');
fullperms=fullperms(ia,:);

% Remove the ones that have no "x"
fullperms(~any(fullperms'==1)',:)=[];

% Tada!

% Replace numbers as:
% x=1
% r=2
% r=3
% 0=4