【问题标题】:Find all possible combinations to a sum in matlab在matlab中找到所有可能的组合
【发布时间】:2013-05-07 02:07:24
【问题描述】:

我正在尝试找到等于某个矩阵的所有可能的总和组合。假设我有:

a = [1 0 0; 0 1 0 ; 0 0 1];
b = [5 0 0; 0 5 0 ; 0 0 5];

我从矩阵a 开始,并希望通过使用r1r2 的矩阵加法来生成矩阵b例如

r1 = [1 0 0; 0 1 0 ; 0 0 1];
r2 = [2 0 0; 0 2 0 ; 0 0 2];

我希望它显示所有组合的矩阵、加法和结果矩阵,我的意思是:4r1 (1+1+1+1+1), 1r1+1r2+1r1 (1+1+2 +1)、1r2+1r1+1r1 (1+2+1+1) 和 2r2 (1+2+2)。

这是我目前得到的,但我无法通过所有组合:

function v = test_r2(a, b)
    if isequal(a,b)==1
        v = [];
        disp('same')
        return
    end
        v= test_r3(a,b);
    end 

function v = test_r3(a, b)`
    r1 = [1 0 0; 0 1 0 ; 0 0 1];
    r2 = [2 0 0; 0 2 0 ; 0 0 2];

    r=[{r1} {r2}];

    if isequal(a,b)==1
        v = b;
    else % recursive call

        for k = 1:numel(r)
        for i = nchoosek(1:numel(r),k)'
            r_matrix = r{1,i};
            if(isequal(a + r_matrix,b) ==1)
                disp([a(:)', r_matrix(:)'])
            end      
        end    
    end

基本上,我希望它通过元胞数组并找到这些加法的所有可能组合,这将使我能够从矩阵a 到矩阵b。有什么帮助吗?

【问题讨论】:

  • 假设您有 n 向量最多需要一个因子 kk*n! 并不是一个很大的数字(例如最多 k=5 和 n=10 或 k =1000和 n=7) 你可以只做几个嵌套的 for 循环并将结果存储在一个巨大的矩阵中。
  • 是否保证所有矩阵都是单位矩阵的倍数?
  • DennisJaheruddin - 如果可能的话,我希望它不要将所有结果存储在一个巨大的矩阵中。我希望矩阵大小(a 和 b)能够扩展得比当前的 3x3 Eitan T 大得多 - 不,矩阵可能不同。例如,r1 可以是 [0 1 3; 2 1 0; 0 0 1]
  • 任何帮助将不胜感激!

标签: matlab matrix


【解决方案1】:

基本上,您希望为 x1 和 x2 解决以下系统:

x1r1 + x2r2 = b - a

在 MATLAB 中,您可以按照官方文档中的 these instructions 执行此操作:

y = reshape(b - a, [], 1);
R = [r1(:), r2(:)];
x0 = R \ y;                     %// Basic solution
Z = null(R, 'r');               %// Null space of R

任何形式的解:x = x0 + Z * p(对于任何任意向量p)都应该满足:y = R * x。请注意,由于浮点运算,这可能会给您带来微小的错误,因此请考虑设置容差阈值并对其进行四舍五入:

idx = (x0 - round(x0) < 100 * eps);
x0(idx) = round(x0(idx));

现在让我们找出所有可能的x0 + Z * p 形式的正整数组合:

if isempty(Z)                   %// Only one solution exists
    X = x0;
else
    N = max([ceil(x0); Z(:)]);  %// Set a search range
    U = cell(size(Z, 2), 1);
    [U{:}] = ndgrid(-N:N);
    U = cellfun(@(x)x(:), U, 'UniformOutput', false);
    P = [U{:}];                 %// All possible values for p within search range
    X = bsxfun(@plus, x0(:).', P * Z.');
    X = unique(X(all(X >= 0, 2), :), 'rows');
end

%// Keep only the positive combinations
X = unique(X(all(X >= 0, 2), :), 'rows');

示例

让我们先设置初始条件:

a = eye(3);
b = 5 * eye(3);
r1 = eye(3);
r2 = 2 * eye(3);

运行第一部分代码后,我们应该得到:

x0 =
     0
     2

Z =
    -2
     1

代码的第二部分应该产生所有可能的正整数组合:

X =
     0     2
     2     1
     4     0

对应总和:0r1 + 2r2, 2r 1 + 1r2 和 4r1 + 0 r2,分别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多