2013-10-27 15 views

Trả lời

1

Bạn có thể làm điều đó bằng cách thực hiện find chức năng cho mỗi hàng như sau:

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 
+1

điều này sẽ thất bại nếu có một hàng của tất cả các số không. – Jonas

9

Đây là một giải pháp dựa trên accumarray rằng sẽ làm việc ngay cả khi một hàng là tất cả các số không.

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); 
+0

+1 Làm thế nào linh hoạt 'accumarray' là –

+1

FYI, bạn có thể cần' accumarray (r, c, [kích thước (A, 1), 1], @ min, NaN) 'vì' accumarray' yêu cầu kích thước được chỉ định là ' [M 1] '(ít nhất là trong phiên bản MATLAB của tôi) – KQS

15

Bạn có thể sử dụng max:

>> [sel, c] = max(A ~=0, [], 2); 

Rows mà sel equalse zero - đều là số không và cột tương ứng trong c nên bỏ qua.

Kết quả:

>> [sel c]= max(A~=0, [], 2) 

sel = 
1 
1 
1 
1 
1 
c = 
1 
1 
3 
2 
1 

Để tìm ra-zero không chỉ số hàng đầu tiên (đối với mỗi cột), bạn chỉ cần áp dụng max trên khía cạnh đầu tiên:

>> [sel r] = max(A~=0, [], 1); 
+0

Đây là một giải pháp tốt hơn vì' find' có thể phát nổ khi làm việc các ma trận lớn hơn. – Maddy

Các vấn đề liên quan