私はこのアルゴリズムを再構築しようとしています:
http://courses.csail.mit.edu/6.006/fall10/lectures/lec02.pdf
(ページ 14 "アルゴリズム II")
(Google でこれを見つけました。残念ながら私は MIT にいません: )これは宿題ではありません)
それは次のとおりです。
•Pick middle column (j=m/2)
•Find global maximum a=A[i,m/2]in that column
(and quit if m=1)
•Compare a to b=A[i,m/2-1]and c=A[i,m/2+1]
•If b>a then recurse on left columns
•Else, if c>a then recurse on right columns
•Else a is a 2D peak!
私が持っているのはこれです:
トリミングされたのは、サイズの頻度 (blockSizeSmall-minBlockSize) を保持するベクトルです。
trimmed.size()
したがって、列と (blockSizeSmall-minBlockSize) 行を持つ 2D マトリックスです。
簡単にするために、ピークを2つのintベクトルvector<int>
peaksrowとpeakscolumnに保存します。
何が問題なのですか?
わからない
"Find global maximum a=A[i,m/2]in that column (and quit if m=1)"
結果になるはずです。
public void findPeaks() {
for (int column = trimmed.size() / 2; column < trimmed.size();) {
int globalmax = 0;
for (int row = 0; row < (blockSizeSmall - minBlockSize); row++) {
if (trimmed.elementAt(column).reducedFreqs[row] > globalmax) {
globalmax = row;
//find globalmax in row
}
}
if (globalmax == 0) {
break; //<- ???
} else {
if (column - 1 >= 0 && column + 1 < trimmed.size()) {
//stay in bounds
if (trimmed.elementAt(column - 1).reducedFreqs[globalmax] > globalmax) {
column--;
//if element at left side is > globalmax, recurse on column--;
} else if (trimmed.elementAt(column + 1).reducedFreqs[globalmax] > globalmax) {
column++;
//if element at right side is > globalmax, recurse on column++;
} else {
//if globalmax is higher than right or left element i have a peak
peaksrown.add(globalmax);
peakscolumnn.add(column);
Log.e(TAG, "" + peaksrown.size());
}
}else{
//what to do when out of bounds ?? break ??
//if i break here, how can i be sure the algorithm
//went to both sides(column=0 and column=max) ??
//just tried with break here, still infinit loop
}
}
}
}
無限にループするだけです。