例如的第一非零元素,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