2016-11-06 5 views
1

У меня есть матрица нулей и единиц. Любой столбец матрицы либо заполнен нулями, либо имеет один.Какие строки имеют значения, отличные от нуля - matlab

т.д .:

A = [0 0 0 0 0; 
    1 0 0 0 0 
    0 0 0 0 0 
    0 0 1 0 0 
    0 0 0 0 1]; 

Я хочу, чтобы получить вектор B, что дает мне положение линии каждого 1. Если нет 1 на колонке она должна дать мне максимальное количество строк. Например:

B = [2 5 4 5 5]; 

Любой простой способ получить это?

ответ

1

Возможное решение с матричным умножением:

A = [0 0 0 0 0; 
    1 0 0 0 0 
    0 0 0 0 0 
    0 0 1 0 0 
    0 0 0 0 1]; 
[r ,~] = size(A); 
B = (1:r) * A; 
B(B==0)=r; 

сравнению с другим методом:

n = 9000; 
ro = randperm(n,4000); 
co = randperm(n , 4000); 
A = accumarray([ro(:) co(:)],1); 


disp('------matrix multiplication---------:') 
tic 
    [r ,~] = size(A); 
    B = (1:r) * A; 
    B(B==0)=r; 
toc 


disp('------find---------:') 

tic 
    [r,~]=find(A);   
    B = double(any(A)); 
    B(B==1)= r; B(B==0)=n; 
toc 

результат:

------matrix multiplication---------: 
Elapsed time is 0.0569789 seconds. 
------find---------: 
Elapsed time is 0.252345 seconds. 
0

Вы можете использовать два-вывода версии max, что дает позитив n каждого максимума. Для столбцов, состоящих только из нулей максимум будет находиться в первом ряду, так что вам нужно, чтобы исправить это, проверяя, если найденный максимум был 0 или 1

[m, result] = max(A, [], 1); % maximum of each column, and its row index 
result(~m) = size(A, 1); % if the maximum was 0: modify result 
Смежные вопросы