まず、ベクトルの要素の絶対値の合計を「エネルギー」と呼んでいる理由がわかりません。「エネルギー」は、要素の二乗の合計(または、これが複素数ベクトルの場合はノルムの二乗の合計)になると予想していました。
第二に、これはかなり間抜けなコードだと思います (信じてください、私は間抜けなコードを知っています ;-) )。行ごとに見ると:
len = length(blocks);
簡単に、「ベクトルの長さまたは最大の配列次元」を取得しています
n = sum(size(blocks)) - len;
あなたの質問では、「ベクトル」でエネルギーを計算していると言いましたが、blocks
実際にベクトルである場合、これは常に数値 1 を返すので、わざわざ計算する必要はありません。blocks
が実際には 2 次元配列である場合n
、2 つの次元のうち小さい方の長さに設定されるようになりました。が Nd 配列の場合blocks
...なぜこの値を計算したいのですか?
currsum = sum(abs(blocks(n,1:len)));
blocks
ここでは、それが 2 次元であると想定しているようです。blocks
ただし、最大の次元が 2 番目の次元であると想定しています (のような配列zeros(10,3)
または列ベクトルに設定すると、このコード行は失敗することに注意してください)。
暗黙の仮定 (blocks
は最後の次元が最も長い 2 次元配列である) を考えると、このすべてのコードを次のように置き換えることができます。
currsum = sum(abs(blocks(end,:)))
これで何が起こっているのかがより明確になりましたが、配列の最後の行の絶対値の合計を計算する必要があるのはなぜでしょうか? 多分それはあなたが本当に望んでいることかもしれませんが、私には奇妙に思えます.
C++ コードを見ると、次のようになります。
int n = (this->width + this->height) - this->width;
なぜ言わないのですか:
int n = this->height;
次に、あなたが持っているループ内
currsum += blocks[i];
まず、なぜ電話しないのですabs()
か?次に、C および C++ は配列を行優先順で格納するため、最後の行ではなく最初の行を合計していませんか? あなたのMATLABコードが本当にあなたが望むことをしていると仮定すると、あなたは次のようなものが欲しいと思います:
double currsum = 0;
for(int i=0; (i < this->width); i++)
{
currsum += abs(blocks[this->height-1][i]);
}