2016-06-14 152 views
2

的總和的所有組合所以我有這段代碼(在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。

我看過combvecallcomb檔案,但他們沒有做我所需要的。例如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列),但如果我們只是有g1g2那麼輸出將是:

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數量。我不能相信這個功能不存在。任何幫助,將不勝感激。

+0

想要的輸出得到您的輸入將有所幫助。 – thewaywewalk

+0

我想如果你把所有的'g'堆棧在一個矩陣中,並且用'u'和'symm'的乘積來創建一個向量,那麼這可能會帶你進入正確的方向並且使代碼更有效率。 –

+0

請注意,轉置只是'。'' – percusse

回答

0

下面是解

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這個巧妙的解決方案。