2012-01-18 75 views
1

固定的第一和最後一個元素,我有如下所示(任意的cols /行)矩陣:Matlab的:在矩陣搜索行與矢量

1 0 0 0 0 
1 2 0 0 0 
1 2 3 0 0 
1 2 3 4 0 
1 2 3 4 5 
1 2 5 0 0 
1 2 5 3 0 
1 2 5 3 4 
1 4 0 0 0 
1 4 2 0 0 
1 4 2 3 0 
1 4 2 5 0 
1 4 2 5 3 
1 4 5 0 0 
1 4 5 3 0 
2 0 0 0 0 
2 3 0 0 0 
2 3 4 0 0 
2 3 4 5 0 
2 5 0 0 0 
2 5 3 0 0 
2 5 3 4 0 
3 0 0 0 0 
3 4 0 0 0 
3 4 2 0 0 
3 4 2 5 0 
3 4 5 0 0 

,現在我想獲得的所有行第一要素是一個確定的值X,並且最後一個元素(即最後一個元素!= 0)是一個確定的值Y或OR:第一個是Y,最後一個是X.

看不到任何快速代碼它不使用for循環:( 謝謝!

編輯:要用特定的第一個元素過濾所有行很容易,你不需要在這裏幫助我。因此,讓我們假設我只想做到以下幾點:過濾所有行的最後一個元素(即最後一個元素每一行!= 0)是X或Y的

編輯 非常感謝您的文章。我使用473408 * 10個元素的矩陣對三種可能的解決方案進行了基準測試。這裏的benchmarkscript: http://pastebin.com/9hEAWw9a

結果爲:

t1 = 2.9425 Jonas 
t2 = 0.0999 Brendan 
t3 = 0.0951 Oli 

所以非常感謝你們,我與奧利奇的解決方案堅持,從而接受它。感謝所有其他解決方案!

回答

2

這裏一招:尋找數字與右側的0,總結他們都:

H=[1 2 0 0 0; 
    2 3 1 0 0; 
    4 5 8 0 0; 
    8 5 4 2 2]; 

lastNumber=sum(H.*[H(:,2:end)==0 true(size(H,1),1)],2) 

ans = 

    2 
    1 
    8 
    2 

其餘很簡單:

firstNumber=H(:,1); 

find((firstNumber==f) & (lastNumber==l)) 
+0

好主意,即使它會失敗,如果在結束之前有零。 +1無論如何 – Jonas 2012-01-18 18:12:00

+0

@Jonas:你的意思就像在布蘭登的解決方案?實際上,就像我在brendans post上評論的那樣,這並不重要,因爲在reall結尾實際上只有零。 – tim 2012-01-18 20:21:22

+0

@Oli:感謝Oli,這也很不錯!看看我在第一篇文章中的編輯,有基準腳本和你的劇本勝利(:因此我接受了! – tim 2012-01-19 07:54:00

5

您只需要找到每行最後一個非零元素的線性索引。剩下的就是簡單:

[nRows,nCols] = size(A); 
[u,v] = find(A); %# find all non-zero elements in A 
%# for each row, find the highest column index with accumarray 
%# and convert to linear index with sub2ind 
lastIdx = sub2ind([nRows,nCols],(1:nRows)',accumarray(u,v,[nRows,1],@max,NaN)); 

要過濾行,那麼你可以寫

goodRows = A(:,1) == X & A(lastIdx) == Y 
+0

ŧ帽子似乎很好,謝謝。我明天會測試它,並告訴你!甚至不知道'sub2ind()'這樣會讓我頭痛不已:)但是如果有人知道它,它可能很容易,哈哈。非常感謝!編輯:也不知道'accumarray' :) – tim 2012-01-18 15:20:46

+0

@ColHeather:accumarray是一個函數,最初有點複雜,但這是非常有用的。 – Jonas 2012-01-18 15:54:21

+1

即使在我的解決方案沒有的情況下,這也可以工作。我們需要閱讀'accumarray' ... – Brendan 2012-01-18 16:19:29

1

這工作只有數字在每行非零隨後進行了一系列的X號零。也就是說,它不會工作,如果以下是可能1 0 3 4 0 0,我認爲是不可能根據您所提供的樣品輸入...

% 'a' is your array 
[nx, ny] = size(a); 
inds = [0:ny:ny*(nx-1)]' + sum(a ~= 0, 2); 
% Needs to transpose so that the indexing reads left-to-right 
aT = a'; 
valid1 = aT(inds) == Y; 
valid2 = a(:,1) == X; 
valid = valid1 & valid2; 
valid_rows = a(valid,:); 

這是凌亂的,我知道...

+0

是的,只有在最後纔會有零,就像你說的:)明天也試試這個,謝謝至今! – tim 2012-01-18 20:13:33

+0

好的,謝謝布蘭登,它對我來說工作得很好。看看我編輯上面的benchmarkscript :-)你很接近奧利的解決方案...... :) – tim 2012-01-19 07:53:21