根据约束 matlab 添加基于 2 个矩阵的数字

Adding numbers based on 2 matrices according to a constraint matlab

我有2个矩阵;矩阵A和矩阵B.

Matrix A = [1 3 6 2 7;
            2 1 5 3 4;
            8 3 7 2 1]

Matrix B = [0 0 1 0 0; 
            0 0 0 0 1;
            0 1 0 0 0]

并且我想检查矩阵 B 中的“1”是否位于矩阵 A 中大于或等于 6 的位置然后保留它事实上。但是如果小于6,则到矩阵A中小于这个数的地方,在矩阵B的这个地方放一个'1',添加 2 个数字并重新检查总和是否等于或大于 6 等等。 正如您在矩阵 B 的第 2 行中看到的那样,1 被放置在矩阵 A 中的 4 的位置。由于 4 小于 6 然后我将转到第二个比 4 小的数字,在这种情况下是 3 并添加 34在一起。这会给我们 7 大于 6 所以我们将停止。所以这里例如输出矩阵将是:

Matrix output = [0 0 1 0 0;
                 0 0 0 1 1;
                 0 1 0 1 1]

步骤:

转到比它小的数字。在这种情况下转到 3,因为它比 4 小。我可以解释更多:

  1. 检查矩阵 B 中 1 的位置,并查看其在矩阵 A 中的值。

  2. 如果矩阵A中的数大于6,则保持不变,矩阵B中的1保持不变,转到另一行。

  3. 如果矩阵A中的数小于6,那么我们想要的是将这个数与另一个数相加,使其等于或大于6。

  4. 这个数字就是比它小的那个。例如,如果该行有 [2 5 6 1 3] 并且 1 被放置在 5 的位置并且 5 小于约束。所以我们必须找到 3,因为它比 5 小一点,然后将它们加在一起。

  5. 添加它们后,将 1 放在两个数字的位置并再次检查约束。如果它满足约束,则离开它们并转到另一行。如果不是,再去那个比数字小的那个,然后做同样的事情。

非常感谢。

此代码在矩阵 B 为空时有效,它将 1 放在最高数字的位置并检查约束。如果它小于数字,它将转到第二大数字并添加并重新检查等等。但我现在想要的是用预定义的 0s 和 1s[= 来解决它35=]

B=zeros(size(A));
for k=1:size(A,1)
a=A(k,:)
[b,ia]=sort(a,'descend')
    c=cumsum(b)
    jj=find(c>=6,1)
    idx=ia(1:jj)
B(k,idx)=1
end

这个花了点时间,但我想我最终还是搞定了...

除最后阶段外,大部分过程没有循环,逐行插入索引以更改 B,这可以通过 arrayfun 完成。我认为可能有一些多余的步骤,但我认为它非常快。

    C = A';
    D = B' > 0 ;
    E  = repmat(max(C(D),1),[1 size(A,2)]);
    F  = A-E<=0;
    G = A.*F;
    [H ind] = sort (G,2,'descend');
    I = (cumsum(H,2) >=6)*-1 +1;
    Indent = ones(size(A,1),1);
    J = [Indent I];
   K = J(:,1:size(A,2)).*ind;

   for t= 1:size(A,1)
       B(t,K(t,K(t,:)~=0)) = 1;
   end

>> B =

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