【问题标题】:Adding numbers based on 2 matrices according to a constraint matlab根据约束matlab添加基于2个矩阵的数字
【发布时间】:2016-06-02 08:54:21
【问题描述】:

我有 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',然后将两个数字相加并重新检查如果总和等于或大于6 等等。 正如您在矩阵 B 第 2 行中看到的那样,1 被放置在矩阵 A4 的位置。由于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. 检查 1 在矩阵 B 中的位置,并查看它在矩阵 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 解决它

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 中可以有多个 1 吗?
  • 所以假设矩阵 B 中有两个 1,并且都小于 6,两者都需要一个共同的元素来总和为 6 - 它仍然是该元素的 1 还是 2 ?
  • 不不,它仍然是 1,它是 0 和 1 的矩阵
  • 你为什么一遍又一遍地转发同一个问题?
  • 我不明白?在哪里?

标签: matlab loops matrix add cumsum


【解决方案1】:

这个花了一些时间,但我想我最终得到了它......

除了最后阶段外,大部分过程没有循环,逐行插入索引以更改 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

【讨论】:

  • A = [2 3 1 4 7;3 5 2 7 1;8 3 7 2 1] B = [0 0 0 1 0;0 0 0 1 0;0 1 0 0 0] [r c] = size(A) for i = 1:r for j = 1:c if(B(i,j) == 1) if A(i,j) =6,1) idx = ia(1:jj) B( i,idx) = 1 end end end end 我实现了这段代码,但我不知道为什么最后一行有问题。你的代码工作得很好,但我想试试这个。那你能帮帮我吗?
  • 我的代码不使用循环,如果您希望其他人为您修复您的循环,请使用正确格式的代码打开一个新帖子,有人可能会提供帮助。
  • @Sassosamer “您的代码运行良好:这就是那个小小的“接受这个解决方案”复选标记的用途!
猜你喜欢
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 2014-04-18
  • 1970-01-01
相关资源
最近更新 更多