我有一個僅由 0 和 1 組成的 3d 二進制陣列 M(x,y,z),然后在每個時間步給我一個二進制矩陣 A(x,y),然后我需要檢查 A(x,y) =M(x,y,z) 對于某些 z,如果不是,那么我將它添加到 M 的末尾,其中 M(x,y,end 1)=A(x,y)。有沒有辦法比檢查每個 z 更快,直到找到相等?
我嘗試回圈遍歷每個 z,但后來我認為應該可以在 M 之外預先計算一些東西,允許我們通過 1 個比較來檢查多個 z。
uj5u.com熱心網友回復:
顯然,如果不檢查所有這些,就沒有辦法做到這一點。
但是,如果您想找到一種更快的方法,我們可以借鑒他們使用“影像積分”的影像處理文獻。只需計算sum(M,[1,2])每個z切片并將其存盤在陣列中。當一個新的 A出現時,計算sum(A(:))并與串列進行比較。然后僅將該匹配的此類索引z與新矩陣完整地進行比較。
根據矩陣的性質,您可能需要找到一個不是積分的不同度量,因為您的應用程式可能會生成歸一化矩陣或類似的東西。只需找到一個足夠不同且易于計算的指標即可。影像積分對于自然影像非常有用。
uj5u.com熱心網友回復:
過早的優化是萬惡之源,我不會嘗試做任何花哨的事情,而是嘗試使用 MATLAB 的陣串列示法和矢量化,然后再擔心優化。我還沒有測驗過,但很有可能只是矢量化事情是相當合理的,因為它使記憶體訪問所需的記憶體訪問統一。這是我的做法:
>> M = rand(3,4,7) > 0.5; % Example data
>> A1 = rand(3,4) > 0.5; % (Probably) not a page of M
>> A2 = M(:,:,3); % Page 3 of M
>> find(all(A1==M, [1 2])) % Use implicit expansion to compare
ans =
0x1 empty double column vector
>> find(all(A2==M, [1 2]))
ans =
3
這在片段中使用隱式擴展(在 R2016b 中引入)Ax == M,然后使用相對較新的(在 R2018b 中引入)矢量化維度說明符來all進行“縮減”片段。
根據@Wolfie 的評論,如果您只需要知道頁面是否存在(而不是在哪里),您可以使用any而不是find
if any(all(A2==M, [1 2]))
% Page was present
else
% Page not already present
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/456634.html
上一篇:在Python中使用嵌套回圈重寫MATLAB代碼并快速執行
下一篇:matlab中向量的連續元素
