把1放在某些地方

时间:2016-06-19 10:43:27

标签: matlab loops matrix sum logical-operators

我有2个矩阵

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

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

矩阵A和B已经定义。

这里每列不能超过1我想要做的是,如果我对Matrix B求和,如果我在其中找到0,我必须在其中添加1' s零,但在某些地方。在每一行中,1必须放在某些组中。例如,如果将1放置在第1列中,则它也可以仅放置在第2列或第3列中。它无法放置在其他任何地方。如果在另一行中它被放置在第5列中,那么它可以仅放置在第4列或第6列中,依此类推。它就像3组一样。每3列都在一起。

更清楚:

这里矩阵B的总和是[1 1 1 1 0 1 0 1 1]。这里的零位于第5列和第7列,我想添加1,记住1将放置在矩阵中。因此,在此示例中,第5列中的1只能放在第4行中,因为此行中的1位于第4列和第6列中。第7列中的1可以放在第5行或第3行中。我们可以选择2行,然后将1放置在更高数量的Matrix A中。 1必须分组;第1,2和3列在一起,第4,5和6列在一起,第7,8和9列在一起。因此,如果将1放在该组的1列中,则无法将其放置在任何其他位置。

如果我们有这样的数组,让我简化它[0 0 0 0 0 0 0 1 1]这个数组有3个类别,第1,2和3列是第1类,第4,5和6列是第2类等等。在这里我想放一个1,这样第三类就不会有零元素。这就是我想要简要介绍的内容,但是包含所有类别的整个矩阵。

所以输出将是=

     [1 0 0 0 0 0 0 0 0;
      0 1 1 0 0 0 0 0 0;
      0 0 0 0 0 0 0 1 0;
      0 0 0 1 1 1 0 0 0;
      0 0 0 0 0 0 1 0 1]

尝试了这段代码,但它并没有提供所需的输出,因为1放在第1行而不是它所在的位置(它应该在的类别)。

sum_cols_B = sum(B);               % Sum of Matrix B (dim 1)      
[~, idx] = find(sum_cols_B == 0);  % Get indices where sum == 0

% Using loop to go through the indices (where sum = 0)          
for ii = idx  
B(1,ii) = 1;                       % Insert 1 in the first position of that 
end                                % column in Matrix B

问我问题是否仍然不明确。!

2 个答案:

答案 0 :(得分:0)

B =  [1 0 0 0 0 0 0 0 0;...
      0 1 1 0 0 0 0 0 0;...
      0 0 0 0 0 0 0 1 0;...
      0 0 0 1 0 1 0 0 0;...
      0 0 0 0 0 0 0 0 1];          % Matrix - using this as an example

sum_cols_B = sum(B);               % Sum of Matrix B (dim 1)      
[~, idx] = find(sum_cols_B == 0);  % Get indices where sum == 0

% Using loop to go through the indices (where sum = 0)          
for ii = idx  
B(1,ii) = 1;                       % Insert 1 in the first position of that 
end                                % column in Matrix B

答案 1 :(得分:0)

这是一个更新的循环,将添加缺少的1'

sum_cols_B = sum(B);
[~, idx] = find(sum_cols_B == 0);

group_size = 3;
for ii = idx 
   % Calculate the starting column of the group for column ii
   % There are (ii-1)/group_size groups
   % Add 1 for 1-based indexing
   group_start = floor((ii-1)/group_size)*group_size + 1;

   % Determine which rows in the current group have nonzero values
   group_mask = sum(B(:,group_start:group_start+group_size-1), 2) > 0;

   % Find the row number of the max in A column ii corresponding to mask
   [~,rownum] = max(A(:,ii).*group_mask);

   % The value in column ii of B should have a 1 inserted
   % at the row containing the max in A
   B(rownum,ii) = 1;
end

以上B的结果是:

B =

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