2011-10-21 43 views
6

Tôi sẽ đánh giá cao nếu ai đó chỉ cho tôi một cách dễ dàng để thực hiện việc này. Giả sử tôi có một vectơ trong MATLAB nhưLoạt các số liên tiếp (độ dài khác nhau)

d = [3 2 4 2 2 2 3 5 1 1 2 1 2 2 2 2 2 9 2] 

Tôi muốn tìm chuỗi số liên tiếp "twos" và độ dài của chuỗi đó.

Số twos có thể dễ dàng được tìm thấy theo số x=find(d==2). Nhưng những gì tôi muốn là để có được một vector chứa độ dài của tất cả các series của twos số liên tiếp, có nghĩa là kết quả của tôi trong trường hợp này sẽ là một véc tơ như thế này:

[1 3 1 5 1]. 

Bất cứ ai có thể giúp tôi?

+0

câu hỏi liên quan: [MATLAB: tìm các đảo 0 trong một chuỗi] (http://stackoverflow.com/questions/3274043/matlab-finding-islands-of-zeros-in-a-sequence) – Amro

Trả lời

9

Điều này dường như làm việc:

q = diff([0 d 0] == 2); 
v = find(q == -1) - find(q == 1); 

cho

v = 

    1 3 1 5 1 

cho tôi

+0

Rất đẹp. ------- –

+0

Cảm ơn rất nhiều, điều này dường như giải quyết vấn đề của tôi! :) – alex

+0

nếu v không phải là vectơ và là động? nếu số thành công là 5 liên tiếp thì thắng? bạn có thể giúp @MAX – pac

6

này được gọi là chạy dài mã hóa. Có một m-file tốt có sẵn cho nó tại http://www.mathworks.com/matlabcentral/fileexchange/4955-rle-deencoding. Phương pháp này nói chung là nhanh hơn so với cách tìm/tìm được đăng trước đó.

tic 
d_rle = rle(d==2); 
d_rle{2}(d_rle{1}==1); 
toc 

Thời gian đã trôi qua là 0,002632 giây.

tic 
q = [0 diff([0 d 0] == 2)]; 
find(q == -1) - find(q == 1); 
toc 

Thời gian đã trôi qua là 0,003061 giây.

+0

Yep - rle() chỉ có một cuộc gọi để tìm(), và tìm() là khá chậm – Max

+0

@Max gọn gàng ... Tôi chưa bao giờ mở nó ra để tìm hiểu lý do. Cảm ơn! –

+0

Cảm ơn bạn cũng đã trả lời câu hỏi này :)! – alex

-1

Điều gì sẽ xảy ra nếu chúng ta muốn các chỉ số của ma trận gốc có giá trị liên tiếp? Hơn nữa, điều gì sẽ xảy ra nếu chúng ta muốn một ma trận có cùng kích thước với ma trận gốc, trong đó số lượng các giá trị liên tiếp được lưu trữ trong các chỉ số của các giá trị liên tiếp? Ví dụ:

original_matrix = [1 1 1;2 2 3; 1 2 3]; 

    output_matrix = [3 3 3;2 2 0;0 0 0]; 

Vấn đề này có liên quan đến kiểm soát chất lượng dữ liệu khí tượng. Ví dụ, nếu tôi có ma trận dữ liệu nhiệt độ từ một số cảm biến, và tôi muốn biết ngày nào có giá trị liên tục liên tục và số ngày không đổi, vì vậy tôi có thể gắn cờ dữ liệu là có thể bị lỗi.

ma trận nhiệt độ là số ngày x số trạm và tôi muốn một ma trận đầu ra cũng là số ngày x số trạm, nơi các giá trị liên tiếp được gắn cờ như mô tả ở trên.

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