Re: [討論] 想請教如何有效率地找出特定元素位置
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):