MATLAB:向量和的所有组合
MATLAB: All combinations of sum of vectors
所以我有这段代码(在 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
的唯一正、负或零组合。我需要一些帮助来概括这一点。即每个g
的大小可以是n
,而g
的个数可以是m
。代码仍应 return g
的所有唯一可能组合。我觉得必须使用递归,但到目前为止我的所有尝试都失败了。
另外 allvecfields(k,:)
仅表示第 k 行,所有列。即使您的答案包含 C/C++ 或 Java 代码(没有任何特殊功能)对我来说也很好。我会把它翻译成 MATLAB。
我查看了 combvec
和 allcomb
文件,但它们没有满足我的需要。例如 transpose(unique(combvec(g1,g2,g3,-g1,-g2,-g3)','rows'))
return 是一个 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'))
我认为这稍微优雅一些,但我仍然坚持如何在给定 gMat
中的列数的情况下动态生成 uMat
。我不敢相信这个功能不存在。任何帮助,将不胜感激。
这是解决方案
g1=[5,0,0];
g2=[0,3,0];
g3=[0,0,4];
gMat=[g1' g2' g3'];
m=size(gMat',1);
allvecfields = zeros(3^m,m);
for k = 1:3^m
allvecfields(k,:) = double(dec2base(k-1,3,m)-'1');
end
realfields = (allvecfields*gMat')'
感谢:Roger Stafford 这个巧妙的解决方案。
所以我有这段代码(在 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
的唯一正、负或零组合。我需要一些帮助来概括这一点。即每个g
的大小可以是n
,而g
的个数可以是m
。代码仍应 return g
的所有唯一可能组合。我觉得必须使用递归,但到目前为止我的所有尝试都失败了。
另外 allvecfields(k,:)
仅表示第 k 行,所有列。即使您的答案包含 C/C++ 或 Java 代码(没有任何特殊功能)对我来说也很好。我会把它翻译成 MATLAB。
我查看了 combvec
和 allcomb
文件,但它们没有满足我的需要。例如 transpose(unique(combvec(g1,g2,g3,-g1,-g2,-g3)','rows'))
return 是一个 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'))
我认为这稍微优雅一些,但我仍然坚持如何在给定 gMat
中的列数的情况下动态生成 uMat
。我不敢相信这个功能不存在。任何帮助,将不胜感激。
这是解决方案
g1=[5,0,0];
g2=[0,3,0];
g3=[0,0,4];
gMat=[g1' g2' g3'];
m=size(gMat',1);
allvecfields = zeros(3^m,m);
for k = 1:3^m
allvecfields(k,:) = double(dec2base(k-1,3,m)-'1');
end
realfields = (allvecfields*gMat')'
感谢:Roger Stafford 这个巧妙的解决方案。