2015-02-12 76 views
2

給定一個數字「c」和一個數字「數字」列表,我試圖生成所有c和任何數字子集的總和。 例如。 (1,[2,4,8]),我應該生成(注意我們應該總是有c) [1,3,5,9,7,11,13,15]對matlab中的所有子集求和

I寫下面的代碼,但不是所有的總和出現。哪裏不對?

function result = allsums(c, numbers) 
    if isempty(numbers) 
     result = []; 
    else 
     [nr n_numbers] = size(numbers); 
     for i = 1:n_numbers 
      result = cat(2, c+numbers(i), allsums(c, cat(2,numbers(1:i-1),numbers(i+1:end)))); 
     end 
    end 

result = cat(2, result, c+sum(numbers,2)); 
end 

回答

2

在該行錯誤:

result = cat(2, sums, c+sum(numbers,2)); 

因爲你回憶功能sums沒有輸入參數,同時用2個輸入參數寫的功能。

UPDATE:

如果length(numbers)小於15(http://www.mathworks.com/help/matlab/ref/nchoosek.html),你可以嘗試nchoosek這樣的:

function result = sums(c, numbers) 
    result = []; 
    if ~isempty(numbers) 
    [nr n_numbers] = size(numbers); 
    result = c; 
    for i = 1:n_numbers 
     combi = nchoosek(numbers, i); 
     for j = 1:size(combi, 1) 
     result(end+1) = c + sum(combi(j,:)); 
     end 
    end 
    end 
    result = unique(result); 
end 

P/S:只是一個很簡單的例子,你可以嘗試優化代碼,我不知道如果使用像你的遞歸更好,或使用Matlab的內置函數更好...

+0

不,總和是一個矩陣元素的總和的matlab函數,2表示總和列的總和我會編輯ma代碼 – giulio 2015-02-12 02:09:23

+0

是的,但主要的錯誤是該行中的第一個「總和」,導致你回憶起你的函數沒有輸入參數。 – scmg 2015-02-12 02:11:43

+0

你的代碼的作品謝謝。但是,我仍然不明白我的遞歸有什麼問題... – giulio 2015-02-12 02:21:21

3

這可能是一種方法 -

%// Input array and scalar 
numbers = [2,4,8] 
c = 1; 

%// Generate all sums for all combinations with nchoosek; then add up with c 
combsums = arrayfun(@(n) sum(nchoosek(numbers,n),2),1:numel(numbers),'Uni',0) 
result = [c ; c+vertcat(combsums{:})] 

代碼運行 -

result = 
    1 
    3 
    5 
    9 
    7 
    11 
    13 
    15 
+0

upvoted。我仍然不習慣用arrayfun替換for-loop ......當邏輯步驟太清晰時,它是一個很大的錘子...... – scmg 2015-02-12 05:11:27

+1

@scmg與'arrayfun'一起使用它是一種緊湊的方式來做東西。另外,當替換大量減少的循環時,比如'arrayfun'中的'sum-reduction',在性能方面我會覺得非常有趣。 – Divakar 2015-02-12 05:14:13

2

怎麼樣一個行的解決方案?

c = 1; %// number 
S = [2 4 8]; %// set 

result = unique(c+S*(dec2bin(0:2^numel(S)-1).'-'0')); 

說明:這裏的關鍵是dec2bin(0:2^numel(S)-1).'-'0',其產生一個0 - 1圖案指示哪個S得到補充的組的元素。在該示例中,這是

0  0  0  0  1  1  1  1 
0  0  1  1  0  0  1  1 
0  1  0  1  0  1  0  1 

每列對應於的S的不同子集。矩陣乘以S然後給出每個子集的總和。

+0

使用'dec2bin'進行組合發現的創新! – Divakar 2015-02-12 12:55:46