的总和的所有组合所以我有这段代码(在MATLAB)MATLAB:矢量
% Define vectorfield
g1=[5,0,0];
g2=[0,3,0];
g3=[0,0,4];
% Define on-off
u=[0;1];
% Define set to make field symmetric
symm=[1;-1];
k=1;
%% Generate possible combinations of vector fields
for a=1:length(u)
for b=1:length(symm)
for c=1:length(u)
for d=1:length(symm)
for e=1:length(u)
for f=1:length(symm)
allvecfields(k,:)=u(a).*symm(b).*g1+u(c).*symm(d).*g2+u(e).*symm(f).*g3;
k=k+1;
end
end
end
end
end
end
realfields=transpose(unique(allvecfields,'rows'));
的realfields
每一列是g
“s的独特正,负或零组合。我需要一些帮助来概括这一点。即每个g
的大小可以是n
,并且g
的个数可以是m
。该代码仍应返回g
的所有可能的唯一组合。我有一种感觉,递归将不得不被使用,但我所有的尝试都失败了。
也allvecfields(k,:)
只是意味着第k行,所有列。即使你的答案包含C/C++或Java代码(没有任何特殊的功能),这对我来说也很好。我将把它翻译成MATLAB。
我看过combvec
和allcomb
档案,但他们没有做我所需要的。例如transpose(unique(combvec(g1,g2,g3,-g1,-g2,-g3)','rows'))
会返回一个6x63矩阵,而不是我想要的3x27。做
vals=transpose(unique(combvec(g1,g2,g3)','rows'));
vals=[vals transpose(unique(combvec(-g1,g2,g3)','rows'))];
vals=[vals transpose(unique(combvec(g1,-g2,g3)','rows'))];
vals=[vals transpose(unique(combvec(g1,g2,-g3)','rows'))];
vals=[vals transpose(unique(combvec(g1,-g2,-g3)','rows'))];
vals=[vals transpose(unique(combvec(-g1,g2,-g3)','rows'))];
vals=[vals transpose(unique(combvec(-g1,-g2,g3)','rows'))];
vals=[vals transpose(unique(combvec(-g1,-g2,-g3)','rows'))];
vals=unique(vals','rows');
给我想要什么,但是这并没有帮助一般化。
编辑:修正第一个代码块最后一行的错误。这种情况下,所需的输出是相当大的(27列),但如果我们只是有g1
和g2
那么输出将是:
realfields =
-5 -5 -5 0 0 0 5 5 5
-3 0 3 -3 0 3 -3 0 3
0 0 0 0 0 0 0 0 0
编辑:基于在评论一个建议,我已经能够重写上面的代码,
u=[-1,0,1];
k=1;
for a=1:length(u)
for b=1:length(u)
for c=1:length(u)
uMat(k,:)=[u(a) u(b) u(c)];
k=k+1;
end
end
end
g1=[5,0,0];
g2=[0,3,0];
g3=[0,0,4];
gMat=[g1' g2' g3'];
for a=1:size(uMat,1)
allvecfields(k,:)=sum(bsxfun(@times,gMat,uMat(a,:)),2);
end
realfields=transpose(unique(allvecfields,'rows'))
我觉得这是稍微更优雅,但我仍然停留在如何动态地生成uMat
给出列的gMat
数量。我不能相信这个功能不存在。任何帮助,将不胜感激。
想要的输出得到您的输入将有所帮助。 – thewaywewalk
我想如果你把所有的'g'堆栈在一个矩阵中,并且用'u'和'symm'的乘积来创建一个向量,那么这可能会带你进入正确的方向并且使代码更有效率。 –
请注意,转置只是'。'' – percusse