如何构建一个单元格以在Matlab中以特定格式存储值?

时间:2013-03-08 01:08:02

标签: arrays matlab matrix cell combinations

我有一个代码,用于查找两个小于特定值的数组之间的最佳组合。代码一次只使用数组B的每一行中的一个值。

B =
       1           2           3
      10          20          30
     100         200         300
    1000        2000        3000

我正在使用的代码是:

B=[1 2 3; 10 20 30 ; 100 200 300 ; 1000 2000 3000];
A=[100; 500; 300 ; 425];
SA = sum(A);
V={}; % number of rows for cell V = num of combinations -- column = 1                
n = 1;
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) <= 2000) %if sum of A + (combination) < 2000
           V(n,1) = {B_subset(:)}; %iterate cell V with possible combinations
           n = n + 1;
        end
    end
end

但是,我希望显示的结果与此代码将其存储在单元格中的方式不同。

而不是在单元格V中显示结果,例如:

[1]
[10]
[300]
[10;200]
[1000;30]
[1;10;300]

这是首选:(每行X列占用单元格中的特定位置) 在这里,这意味着它们应该被安排为cell(1,1)={[B(1,x),B(2,y),B(3,z),B(4,w)]}。其中x y z w是具有所选值的列。这样显示的输出是:

[1;0;0;0]
[0;10;0;0]
[0;0;300;0]
[0;10;200;0]
[0;30;0;1000]
[1;10;300;0]

在每个答案中,通过选择矩阵B的第1行到第4行的值来确定组合。每行有3列,每行只能选择一个值。但是,如果例如不能使用B(1,2),它将被替换为零。例如如果B的第1行无法使用,那么B(1,1:3)将是单个0.结果将是[0; x; y; z]。

  • 因此,如果从第1行中选择了2,并且从第2行中选择了20,那么不包括第3行第4行,它们应该显示为0.所以答案是[2; 20; 0; 0]。
  • 如果仅使用第4行(例如1000),则答案应为[0; 0; 0; 1000]

总之,我想实现以下内容:

  • 每个单元格包含来自B的每一行的length(B)值(基于组合)
  • 组合中未使用的每个值都应为0并打印在单元格中

我目前正在尝试实施此功能,但我的方法无效。如果您需要更多信息,请告知我们。

修改

我已经尝试在下面的dfb答案中实现代码但有困难,请看一下答案,因为它包含一半的解决方案。

1 个答案:

答案 0 :(得分:0)

我的MATLAB非常生疏,但是这样的东西不能满足你的需求吗?

arr =  zeros(1,len(B))
arr(idx) = B_subset(:)
V(n,1) = {arr}