我有一个问题,我需要构建一个函数,该函数的输出是一个元素的所有可能组合的矩阵,该元素仅重复一次,而另一个元素可以是一个或多个。
例如,假设我们有一个尺寸为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;
请帮忙。
谢谢
答案 0 :(得分:1)
您遇到了一个棘手的问题。这是我解决的方法:
r
:r1
,r2
。r1
代替r2
,反之亦然)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