2013-08-07 63 views
0

這是一個非常具體的問題。我有一個M * 3矩陣。第一列包含M組元素。它可能會遵循這一點。特定列[刪除元素直到上一個零元素,然後從第一個零元素刪除元素到結束]

0 
0 
0 
0 
1 
1 
1 
1 
1 
1 
1 
1 
1 
0 
0 
0 
0 
0 

我的興趣只有1s和相應的其他列值。我可以刪除零買一套新只用1秒矩陣的,但有時也可能遵循此:

1 
1 
1 
0 
0 
0 
0 
0 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
0 
0 
1 
1 

時的情況類似上面我想不顧1S在一開始並刪除M中的所有元素* 3矩陣到第一個1,然後當它到達列的第二個零開始時,它可以將所有的值移到列的末尾。 (所以它將是13 * 3矩陣)。

我正在做這個matlab。 謝謝:)

回答

2

讓我們把你的矩陣A:

firstCol = A(:, 1); 

indices = find(firstCol); 
check = find(diff(indices) ~= 1); 

if (isempty(check)) 
    Afinal = A(indices, :); 
else 
    indices2 = indices(check(1)+1:1:check(2)); 
    Afinal = A(indices2, :); 
end 

Afinal應該是你要找的輸出。

+1

它的工作,但你能解釋我是如何工作的?謝謝:) – user2661372

+1

第一行提取第一列。第二行獲得一個數組,其中包含第一列中每個條目的索引,第一行是第一行。第三行獲取索引中連續值之間的差異,並查找所有不相差1的索引(換句話說,以零分隔的1的索引)。如果檢查是空的,這意味着我們有您列出的第一個案例,我們只是提取我​​們想要的行。否則,檢查中的第一個和第二個值將指示圍繞1的中間運行的索引。這適用於您列出的案例。 – MattG

+0

在某些情況下,我收到此錯誤:嘗試訪問檢查(2);索引越界 ,因爲numel(check)= 1。 abc2錯誤(第162行) indices2 =索引(check(1)+1:1:check(2)); – user2661372