我有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
问我问题是否仍然不明确。!
答案 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