Matlab 根据约束条件,基于2个矩阵添加数字
我有2个矩阵;矩阵A和矩阵BMatlab 根据约束条件,基于2个矩阵添加数字,matlab,loops,matrix,add,cumsum,Matlab,Loops,Matrix,Add,Cumsum,我有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”,将两个数字相加,然后重新检查总
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
相加。这将给我们提供大于6的7
,因此我们将停止。例如,这里的输出矩阵是:
Matrix output = [0 0 1 0 0;
0 0 0 1 1;
0 1 0 1 1]
步骤如下:
转到刚好比它小的数字。在本例中,转到3,因为它只是比4小的一个。我可以进一步解释:
B
为空时,此代码工作,它将1置于最高数字的位置,并检查约束。如果小于该数字,它将转到第二高的数字,然后添加并重新检查,依此类推。。但是我现在想要的是用预定义的0
s和1
s来解决它
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
C=A';
D=B'>0;
E=repmat(最大值(C(D),1),[1尺寸(A,2)];
F=A-E=6)*-1+1;
缩进=个(尺寸(A,1),1);
J=[缩进I];
K=J(:,1:size(A,2)).*ind;
对于t=1:尺寸(A,1)
B(t,K(t,K(t,:)~=0))=1;
结束
>>B=
0 0 1 0 0
0 0 0 1 1
0 1 0 1 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
C=A';
D=B'>0;
E=repmat(最大值(C(D),1),[1尺寸(A,2)];
F=A-E=6)*-1+1;
缩进=个(尺寸(A,1),1);
J=[缩进I];
K=J(:,1:size(A,2)).*ind;
对于t=1:尺寸(A,1)
B(t,K(t,K(t,:)~=0))=1;
结束
>>B=
0 0 1 0 0
0 0 0 1 1
0 1 0 1 1
矩阵B中是否有多个1?假设矩阵B中有两个1,并且都小于6,两者都需要一个公共元素来求和到6-该元素还是1,还是2?不,不,它仍然是1,它是0和1的矩阵你为什么一遍又一遍地发布同一个问题?我不明白?在哪里?矩阵B中可以有多个1吗?假设矩阵B中有两个1,都小于6,都需要一个公共元素来求和到6-这个元素还是1,还是2?不,不,仍然是1,它是一个0和1的矩阵你为什么一遍又一遍地发布同一个问题?我不明白?其中?A=[2 3 1 4 7;3 5 2 7 1;8 3 7 2 1]B=[0 0 1 0;0 0 1 0 0][r c]=i=1的大小(A):j=1的大小(r):如果(B(i,j)==1)如果A(i,j)我的代码不使用循环,如果你想让其他人帮你修复循环,请用格式正确的代码打开一篇新帖子,也许有人能帮你。@Sassossamer您的代码运行得非常好:这就是“接受此解决方案”复选标记的作用!A=[2 3 1 4 7;3 5 2 7 1;8 3 7 2 1]B=[0 0 1 0;0 0 1 0;0 1 0 0][r c]=i=1的大小(A):j=1的大小(r):如果(B(i,j)==1)如果A(i,j)我的代码不使用循环,如果你想让其他人帮你修复循环,请用格式正确的代码打开一篇新帖子,也许有人能帮上忙。@sassossamer您的代码运行得非常好:这就是“接受此解决方案”复选标记的作用!