Поиск номера столбца единственного нуля в строке в MATLAB - PullRequest
3 голосов
/ 19 марта 2019

У меня большая матрица, состоящая только из единиц и нулей. Среди строк, которые содержат только один ноль, мне нужно найти индекс этого ноля (или номер столбца ноля).

Я пытаюсь использовать следующую команду, но она возвращает мне только номер соответствующей строки. Может кто-нибудь сказать мне, как изменить эту команду или добавить дополнительную команду, чтобы найти номер столбца этого нуля, а?

find(sum(~A,2) == 1)

Ответы [ 3 ]

3 голосов
/ 19 марта 2019

Вы можете использовать min, чтобы найти индексы минимального элемента каждой строки, а затем использовать номера строк, чтобы извлечь индексы столбцов:

[~, idx] = min(A, [], 2);
r = find(sum(~A, 2) == 1);
c = idx(r);

Это может быть более эффективно, если вы используете:

r = find(sum(A, 2) == size(A,2)-1);
3 голосов
/ 19 марта 2019

Ваша проблема в том, что sum(~A,2) == 1 - это вектор столбца, поэтому вы теряете данные о том, какой столбец вы хотите.

Вы можете сделать следующее:

% (A == 0)         : Elements where A is zero
% (sum(~A,2) == 1) : Rows where there's exactly 1 zero
% We want the matrix where both of these are true...
idx = (sum(~A,2) == 1) .* (A == 0);  
% We want the row and column indices of the zeros
[r,c] = find( idx );

Пример:

% A with single-zero rows in positions (2,1) and (4,2)
A = [ 1 1 1 1 1 1
      0 1 1 1 1 1
      1 0 1 0 1 1 
      1 0 1 1 1 1 
      1 1 1 1 1 1 
      1 1 1 1 0 0 ];

idx = (sum(~A,2) == 1) .* (A == 0); % Could replace (A==0) with (~A)
[r,c] = find(idx)

% r = [2; 4]
% c = [1; 2]; 

Примечание: это зависит от неявного расширения, совместимого с MALTAB R2016b или новее. Вы не упомянули свою версию в вопросе, но для более старых версий используйте это для idx:

idx = bsxfun( @times, (sum(~A,2) == 1), (A == 0) );
1 голос
/ 19 марта 2019

Вы можете запустить свою команду еще раз, в следующем направлении. Если у вас есть неопределенное количество строк, было бы удобно сделать это в цикле:

rows = find(sum(~A,2) == 1);
columns=[];
for i = 1:length(rows)
    columns(end+1)=find(sum(~A(rows(i),:),1)==1);
end
disp(rows)
disp(columns)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...