2014-03-19 159 views
-3

我想在MATLAB中找到矩陣中所有非零元素的座標。我知道find使這非常簡單。問題是我需要在填充之前定義矩陣的長度。我相信這是不可能使用find,因爲它會製作自己的矢量。實現matlab查找功能

所以我必須找到另一種方式。如果我正在尋找1個元素,它也會很容易。讓我用一個例子。假設我有一個500×500的矩陣M,其中有60。我想找到座標。所以我可以從下面開始:

for i = 1:500 
    for j = 1:500 
    if M(i,j) == 1 
     row = i; 
     col = j; 
    end 
    end 
end 

但是我想要多一點,我需要在填充之前定義一個向量的長度。所以我會做賭注,有小於100成的人在矩陣:

v = zeros(1,100) 
w = zeros(1,100) 

怎麼我基本上是想填補這個矢量如下。比方說,我已經填補了向量的N元素,所以下一個會是:

for i = 1:500 
    for j = 1:500 
    if M(i,j) == 1 && i ~= v(1) && i ~= v(2) && ... && i ~= v(N) && j ~= v(1) && ... && i ~= v(N) 
    v(N+1) = i 
    w(N+1) = j 
    end 
    end 
end 

所以我需要另一個包含所有這一切,將通過矢量vw的元素運行循環,我需要一些循環來確保if語句正在被使用。

有沒有人有任何想法如何做到這一點?

親切的問候,

傑西

+1

我不知道我理解你,你知道你可以指定要查找多少個元素作爲參數返回? – Dan

+0

對我來說,聽起來像[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)...請最後解釋你想達到的目的,而不是而不是詢問您在嘗試實現時遇到的問題。 –

+0

你知道你的第二個實現是不正確的嗎?那一個不會找到所有1的正確。此外,如果你做得對,'[vw]'將等於'[v2 w2] = find(M)'...我只是不確定你在這裏得到什麼...... –

回答

2

老實說,我不明白這有什麼錯find
但是,如果你使用嵌套循環,然後

v = NaN(100,1); 
w = NaN(100,1); % pre-allocate 
ii=1; 
for row=1:size(M,1) 
    for col=1:size(M,2) 
     if M(row,col) == 1 
      v(ii)=row; 
      w(ii)=col; 
      ii=ii+1; %counts howmany elements were found 
     end 
    end 
end 
v(isnan(v))=[]; %discard redundent elements 
w(isnan(w))=[]; 
3

這裏的另一種方式在自己的實現堅持,好的&浪費:

[jj,ii] = meshgrid(1:size(M,2),1:size(M,1));   
inds = M~=0; 
ii = ii(inds); 
jj = jj(inds); 
+0

我不知道該說些什麼。使用邏輯索引而不是'find'是「作弊」? – Shai

+0

@Shai:......我覺得很骯髒......: –