Re: [討論] 想請教如何有效率地找出特定元素位置

看板MATLAB作者 (早立衫)時間12年前 (2013/10/10 13:42), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《banco (Acoustic)》之銘言: : ※ 引述《smarter1004 (請拒絕看各新聞台)》之銘言: : : 各位高手大家好 : : 假設 size(a) = [1 5] : : 那如果我要找出a中等於0的元素位置我只要輸入 : : a == 0 : : 那麼如果 size(a) = [10 5] : : 我要找出a中等於[1 2 3 4 5]的row似乎只能用for迴圈解決 : : 但它實在有夠慢 : : 有沒有類似第一個有效率方法的寫法呢? : : 謝謝各位 : 把它視為矩陣運算會比較快 : 我亂造一個 pp x 5 的矩陣M : 每個row的數值為介於0~10的整數 : 從裡面找有哪些row的內容為 [1 2 3 4 5] : 基本想法是先來個矩陣減法 : 再來找哪些row的平方和為0 : pp=1000000; : a = [1 2 3 4 5]; : M = floor(rand(pp,5)*10); : tic; : tmp=(M-ones(pp,1)*a)'; : find(sum( tmp.^2 )==0) : toc a=[1 2 3 4 5] pp=1000000; M = floor(rand(pp,5)*10); s1=[1:pp]; for kk=1:5 s2=find(M(s1,kk)==a(kk)); s1=s1(s2); end s1為最後結果 手上沒環境可以測試 不過應該邏輯沒大問題吧 這樣只要跑五個迴圈,每次跑的運算量也會變少 再稍微小改一下,a的長度還可以用size得到,在帶入for的數字。 限制就是每一個row 只能從頭比對。 M如果是[10000,100], 要找後面的是否有符合的話 還需要在修改一下,應該也可以不用多一個迴圈。 至於上面的完全不用迴圈的話.... 假設"=="可以矩陣元素一對一比較的話。我印象中可以這樣做 超級暴力法 b=sum(M==a(ones(1,pp),:),2); ^^^ 這個不確定要用2或是1 主要是讓比較               過後的每一個row加總 s1=find(b==5); 另也可以把上兩行用成一行搞定 s1=find(sum(M==a(ones(1,pp),:),2)==5); 不過a的擴充矩陣會很吃記憶體,所以選著用吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.44.229.37
文章代碼(AID): #1ILZuu-z (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1ILZuu-z (MATLAB)