需要帮助在Matlab中调试此代码

时间:2013-03-08 05:43:46

标签: arrays debugging matlab cell combinations

我有以下代码

B=[1 2 3; 10 20 30 ; 100 200 300 ; 500 600 800];
A=[100; 500; 300 ; 425];
SA = sum(A);
V={}; % number of rows for cell V = num of combinations -- column = 1                
n = 1;
 arr =  zeros(1,length(B))
for k = 1:length(B)                    
    for idx = nchoosek(1:numel(B), k)'  
       rows = mod(idx, length(B))
       if ~isequal(rows, unique(rows)) %if rows not equal to unique(rows)
           continue  %combination possibility valid      
       end %Ignore the combination if there are two elements from the same row 
       B_subset = B(idx)
       if (SA + sum(B_subset) <= 3000) %if sum of A + (combination) < 3000
           rows( rows==0 )=4
           arr(rows) = B_subset(:)
           V(n,1) = {arr}
           n = n + 1
            arr =  zeros(1,length(B))
        end
    end
end

如果A的总和和B的某些值小于3000,则组合应该是有效的。

我的代码问题是,B的最后一个值B(3,3)仅在代码中占一次。

如果您运行代码,您会在第12行注意到V包含[0;0;0;800]的一个单元格。但也有其他可能的组合,例如[1;0;0;800]。在SA + (1 + 800) < 3000的地方,但是代码没有打印出这种可能性。

我无法弄清楚原因,有人可以帮我调试一下,找出为什么跳过某些组合?特别是B(3,3)

1 个答案:

答案 0 :(得分:0)

我怀疑这条线并没有完全按照你的意图行事:

if ~isequal(rows, unique(rows))

相反,试试这个:

if ~isequal(length(rows), length(unique(rows)))