我有一个代码,用于查找两个小于特定值的数组之间的最佳组合。代码一次只使用数组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]。
2
,并且从第2行中选择了20
,那么不包括第3行和第4行,它们应该显示为0.所以答案是[2; 20; 0; 0]。总之,我想实现以下内容:
length(B)
值(基于组合)我目前正在尝试实施此功能,但我的方法无效。如果您需要更多信息,请告知我们。
修改
我已经尝试在下面的dfb答案中实现代码但有困难,请看一下答案,因为它包含一半的解决方案。
答案 0 :(得分:0)
我的MATLAB非常生疏,但是这样的东西不能满足你的需求吗?
arr = zeros(1,len(B))
arr(idx) = B_subset(:)
V(n,1) = {arr}