Например,Matlab: Во-первых Ненулевое элемент каждой строки или столбца
A = [ -1 0 -2 0 0
2 8 0 1 0
0 0 3 0 -2
0 -3 2 0 0
1 2 0 0 -4];
как можно получить вектор из первых ненулевых элементов каждой строки?
Например,Matlab: Во-первых Ненулевое элемент каждой строки или столбца
A = [ -1 0 -2 0 0
2 8 0 1 0
0 0 3 0 -2
0 -3 2 0 0
1 2 0 0 -4];
как можно получить вектор из первых ненулевых элементов каждой строки?
Вы можете сделать это, выполнив find функцию для каждой строки следующим образом:
A = [ -1 0 -2 0 0
2 8 0 1 0
0 0 3 0 -2
0 -3 2 0 0
1 2 0 0 -4];
% make cell of rows
cellOfRows = num2cell(A, 2);
% apply find function for each row
indexOfFirstNonZeroValues = cellfun(@(row) find(row, 1, 'first'), cellOfRows);
indexOfFirstNonZeroValues =
1
1
3
2
1
это не удастся, если есть строка всех нулей. – Jonas
Вот решение, основанное на accumarray, что будет работать, даже если строка все нули.
A = [ -1 0 -2 0 0
2 8 0 1 0
0 0 3 0 -2
0 -3 2 0 0
1 2 0 0 -4];
[r,c] = find(A);
%# for every row, take the minimum column index and put NaN if none is found
firstIndex = accumarray(r,c,[size(A,1),1],@min,NaN);
+1 Насколько универсальным 'accumarray' является –
FYI, вам может понадобиться' accumarray (r, c, [size (A, 1), 1], @ min, NaN) ', потому что' accumarray' требует, чтобы размер указывался как ' [M 1] '(по крайней мере, в моей версии MATLAB) – KQS
Вы можете использовать max
:
>> [sel, c] = max(A ~=0, [], 2);
Ряды, для которых sel
equalse ноль - все нули и соответствующий столбец в c
следует игнорировать.
Результат:
>> [sel c]= max(A~=0, [], 2)
sel =
1
1
1
1
1
c =
1
1
3
2
1
Для того, чтобы найти первый ненулевой индекс строки (для каждого столбца) нужно просто применить max
на первое измерении:
>> [sel r] = max(A~=0, [], 1);
Это лучшее решение, так как' find' может взорваться при работе с большими матрицами. – Maddy
что вы ожидаете если есть строка «все нули»? – Shai