0

基本的に、MatLabからC++に変換するためのこの最後のコードがあります。

この関数は2Dベクトルを取り込んでから、2Dベクトルの要素を2つの基準と照合し、一致しない場合はブロックを削除します。しかし、MatLabのコードが返されるもの、2Dまたは1Dベクトルに混乱していますか?コードは次のとおりです。

function f = strip(blocks, sumthresh, zerocrossthresh)

% This function removes leading and trailing blocks that do 
% not contain sufficient energy or frequency to warrent consideration.
% Total energy is measured by summing the entire vector.
% Frequency is measured by counting the number of times 0 is crossed.
% The parameters sumthresh and zerocrossthrech are the thresholds,
% averaged across each sample, above which consideration is warrented.

% A good sumthresh would be 0.035
% A good zerocrossthresh would be 0.060

len = length(blocks);
n = sum(size(blocks)) - len;
min = n+1;
max = 0;
sumthreshtotal = len * sumthresh;
zerocrossthreshtotal = len * zerocrossthresh;
for i = 1:n
currsum = sum(abs(blocks(i,1:len)));
currzerocross = zerocross(blocks(i,1:len));
if or((currsum > sumthreshtotal),(currzerocross > zerocrossthreshtotal))
if i < min
  min = i;
end
if i > max;
  max = i;
  end
end
end

% Uncomment these lines to see the min and max selected
% max
% min

 if max > min
   f = blocks(min:max,1:len);
 else
 f = zeros(0,0);
end

あるいは、別のベクトル(1Dまたは2D)を返す代わりに、実際にベクトルのメモリ位置を送信して、そこからブロックを削除する方がよいでしょうか?だから例えば..

for(unsigned i=0; (i < theBlocks.size()); i++)
{
  for(unsigned j=0; (j < theBlocks[i].size()); j++)
  {
      // handle theBlocks[i][kj] .... 
  }
}

また、私はこの行を理解していません:

currsum = sum(abs(blocks(i,1:len)));

基本的に:(i、1:len)

何か案は?ありがとう :)

4

1 に答える 1

2

blocks(i,1:len)から移動したいことを配列に伝えていblocks[i][1 to the end]ます。したがって、3x3 配列の場合は、次のようになります。

blocks[i][1]
blocks[i][2]
blocks[i][3]
.
.
.
blocks[i][end]

次に、行列の内容の絶対値を取得し、それらを加算します。[x][x] 行列を返しますが、長さは 0x0 または (max)X(len) になります。

于 2012-08-16T17:35:13.817 に答える