【发布时间】: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 被放置在矩阵 A 中 4 的位置。由于4 小于6,那么我将转到第二个小于4 的数字,在这种情况下为3,并将3 和4 加在一起。这将给我们7,它大于6,所以我们将停止。所以这里例如输出矩阵将是:
Matrix output = [0 0 1 0 0;
0 0 0 1 1;
0 1 0 1 1]
步骤:
转到比它小的数字。在这种情况下,请转到 3,因为它比 4 小。我可以解释更多:
检查 1 在矩阵 B 中的位置,并查看它在矩阵 A 中的值。
如果矩阵 A 中的数字大于 6,则保持原样,矩阵 B 中的 1 保持原样,然后转到另一行。
如果矩阵 A 中的数字小于 6,那么我们想要的是将这个数字与另一个数字相加,使其等于或大于 6。
这个数字刚好比它小。例如,如果该行具有 [2 5 6 1 3] 并且 1 放置在 5 的位置并且 5 小于约束。所以我们必须去 3,因为它只是比 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