Ví dụ,Matlab: Thành tố thứ nhất Non-zero của mỗi hàng hoặc cột
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];
làm thế nào tôi có thể nhận được một vector của các yếu tố khác không đầu tiên của mỗi hàng?
Ví dụ,Matlab: Thành tố thứ nhất Non-zero của mỗi hàng hoặc cột
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];
làm thế nào tôi có thể nhận được một vector của các yếu tố khác không đầu tiên của mỗi hàng?
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
đ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
Đâ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);
+1 Làm thế nào linh hoạt 'accumarray' là –
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
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);
Đâ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
những gì bạn mong đợi nếu có hàng "tất cả số không"? – Shai