簡體   English   中英

在Matlab中進行矢量化范圍檢查

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM