[英]Vectorized range checking in Matlab
在嘗試將算法從C#移植到Matlab時,我發現Matlab在運行循環時效率很低。 因此我想要對算法進行矢量化。
我有以下輸入:
低量程:
[ 00 10 20 30 40 50 ... ]
高變速:
[ 10 20 30 40 50 60 ... ]
這些數組的長度相等。
我現在有第三個數組Values
(可以是任何長度),對於這個數組,我想計算在lowerange(i)
和highrange(i)
之間出現的Values
元素(你可以看到我來自for循環) 。
輸出應該是長度低范圍/高范圍的數組。
所以用上面的數組和輸入LineData
:
[ 1 2 3 4 6 11 12 16 31 34 45 ]
我希望得到:
[ 05 03 00 02 01 00 ... ]
我試過(對我來說)顯而易見的事情:
LineData(LineData < PixelEnd & LineData > PixelStart)
但這不起作用,因為它只是按元素方式檢查元素上的LineData。 它不會嘗試對LineData
所有值應用比較。
不幸的是,由於我還沒有習慣用Matlab的“向量”方式思考,所以我無法想出任何其他內容,更不用說從內存中了解所有適用的指令。
當您想要使用給定邊緣執行基本直方圖時,您可以使用Matlabs內置函數histc:
values = [ 1 2 3 4 6 11 12 16 31 34 45 ];
edges = 0:10:60;
histc(values, edges)
ans =
5 3 0 2 1 0 0
對於具有相同間隔且從0
開始的范圍,這里是基於bsxfun
的計數方法 -
LineData = [ 1 2 3 4 6 11 12 16 31 34 45 ] %// Input
interval = 10; %// interval width
num_itervals = 6; %// number of intervals
%// Get matches for each interval and sum them within each interval for the counts
out = sum(bsxfun(@eq,ceil(LineData(:)/interval),1:num_itervals))
輸出 -
LineData =
1 2 3 4 6 11 12 16 31 34 45
out =
5 3 0 2 1 0
假設最后一個區間是保持輸入數據最大值的區間,你也可以嘗試基於diff
+ indexing
的方法 -
LineData = [ 1 2 3 4 6 11 12 16 31 34 45 ] %// Input
interval = 10; %// interval width
labels = ceil(LineData(:)/interval); %// set labels to each input entry
df_labels = diff(labels)~=0; %// mark the change of labels
df_labels_pos = find([df_labels; 1]); %// get the positions of label change
intv_pos= labels([true;df_labels]);%// position of each interval with nonzero counts
%// get counts from interval between label position change and put at right places
out(intv_pos) = [ df_labels_pos(1) ; diff(df_labels_pos)];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.