2011-07-01 64 views
8

Tôi có một dãy các số nguyên, và tôi muốn chia mảng này với 0 đến và một hàm cho tôi điểm chia tách.Tách một mảng trong MATLAB

Ví dụ: Array: 0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0

Chức năng phải trả lại những con số:

[ 3 10 ;14 20 ;22 25 ] 

Những con số này là chỉ số bắt đầu và kết thúc của các số không.

+0

@amro - điều này giống như nghịch đảo của vấn đề đó nơi OP đang cố gắng tìm các đảo có giá trị khác 0. – Kev

+0

@Kev: để chuyển đổi sang giá trị khác, nó đơn giản như thêm 'mảng = (mảng == 0);' khi bắt đầu (hoặc cách khác xung quanh 'mảng ~ = 0', tùy thuộc vào cách bạn đang xem nó) ... – Amro

+0

@amro - đúng, nhưng nó không phải là bản sao "chính xác". – Kev

Trả lời

5

Dưới đây là một giải pháp vectorized đơn giản bằng cách sử dụng chức năng DIFFFIND:

>> array = [0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0]; %# Sample array 
>> edgeArray = diff([0; (array(:) ~= 0); 0]); 
>> indices = [find(edgeArray > 0)-1 find(edgeArray < 0)] 

indices = 

    3 10 
    14 20 
    22 25 

Đoạn mã trên hoạt động bằng cách trước tiên tạo một mảng cột với những người chỉ ra các yếu tố khác không, đệm mảng này bằng số không (trong trường hợp bất kỳ khoảng không khác nào kéo dài đến các cạnh của mảng) và lấy các khác biệt khôn ngoan của phần tử. Điều này cho một vector edgeArray với 1 cho biết sự bắt đầu của khoảng không khác và -1 cho biết kết thúc của một khoảng không khác. Sau đó, hàm FIND được sử dụng để lấy các chỉ số bắt đầu và kết thúc.

Một lưu ý phụ/nitpick: đây không phải là chỉ số của phần bắt đầu và kết thúc của các nhịp không khác như bạn nói. Về mặt kỹ thuật, chúng là chỉ số ngay trước khi bắt đầu và chỉ sau kết thúc của các nhịp không khác. Bạn thể thực sự muốn những điều sau thay vì:

>> indices = [find(edgeArray > 0) find(edgeArray < 0)-1] 

indices = 

    4  9 
    15 19 
    23 24 
2

Hãy thử điều này

a = [0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0]; 

%#Places where value was zero and then became non-zero 
logicalOn = a(1:end-1)==0 & a(2:end)~=0; 

%#Places where value was non-zero and then became zero 
logicalOff = a(1:end-1)~=0 & a(2:end)==0; 

%#Build a matrix to store the results 
M = zeros(sum(logicalOn),2); 

%#Indices where value was zero and then became non-zero 
[~,indOn] = find(logicalOn); 

%#Indices where value was non-zero and then became zero 
[~,indOff] = find(logicalOff); 

%#We're looking for the zero AFTER the transition happened 
indOff = indOff + 1; 

%#Fill the matrix with results 
M(:,1) = indOn(:); 
M(:,2) = indOff(:); 

%#Display result 
disp(M); 
2

Trên chủ đề, nhưng với sự thay đổi nhỏ:

>>> a= [0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0]; 
>>> adjust= [0 1]'; 
>>> tmp= reshape(find([0 diff(a== 0)])', 2, []) 
tmp = 
    4 15 23 
    10 20 25 
>>> indices= (tmp- repmat(adjust, 1, size(tmp, 2)))' 
indices = 
    4 9 
    15 19 
    23 24 

Như gnovice đã chỉ ra trên ngữ nghĩa vị trí liên quan đến indices, tôi sẽ chỉ cần thêm rằng, với giải pháp này, các lược đồ khác nhau có thể được xử lý rất đơn giản, khi tính toán indices. Do đó, đối với yêu cầu của bạn:

>>> adjust= [1 0]'; 
>>> tmp= reshape(find([0 diff(a== 0)])', 2, []); 
>>> indices= (tmp- repmat(adjust, 1, size(tmp, 2)))' 
indices = 
    3 10 
    14 20 
    22 25 
Các vấn đề liên quan