Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 根据约束条件,基于2个矩阵添加数字_Matlab_Loops_Matrix_Add_Cumsum - Fatal编程技术网

Matlab 根据约束条件,基于2个矩阵添加数字

Matlab 根据约束条件,基于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”,将两个数字相加,然后重新检查总

我有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
相加。这将给我们提供大于6的
7
,因此我们将停止。例如,这里的输出矩阵是:

Matrix output = [0 0 1 0 0;
                 0 0 0 1 1;
                 0 1 0 1 1]
步骤如下:

转到刚好比它小的数字。在本例中,转到3,因为它只是比4小的一个。我可以进一步解释:

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

  • 如果矩阵A中的数字大于6,保持原样,矩阵B中的1保持原样,转到另一行

  • 如果矩阵A中的数字小于6,那么我们需要的是将这个数字与另一个数字相加,使之等于或大于6

  • 这个数字刚好比它小。例如,如果行具有[2 5 6 1 3],并且1放置在5的位置,并且5小于约束。所以我们必须到3,因为它比5小,然后把它们加在一起

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

  • 非常感谢你

    当矩阵
    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您的代码运行得非常好:这就是“接受此解决方案”复选标记的作用!