0

ベクトルのエネルギーを計算する必要があり、Matlab で次のように実行できます。

len = length(blocks);
n = sum(size(blocks)) - len;
currsum = sum(abs(blocks(n,1:len)));

これは完全に正常に動作し、4.8750 の結果が得られますが、C++ で試行するたびに間違った結果が得られ、どこが間違っているのか誰かが知っているかどうか疑問に思いました。コードは次のとおりです。

int n = (this->width + this->height) - this->width;
double currsum = 0;

for(int i=0; (i < n); i++)
{
    currsum += blocks[i];

}

C++ での結果: 0.46875

誰かがこれに光を当てることができることを願っています:)

4

1 に答える 1

2

まず、ベクトルの要素の絶対値の合計を「エネルギー」と呼んでいる理由がわかりません。「エネルギー」は、要素の二乗の合計(または、これが複素数ベクトルの場合はノルムの二乗の合計)になると予想していました。

第二に、これはかなり間抜けなコードだと思います (信じてください、私は間抜けなコードを知っています ;-) )。行ごとに見ると:

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]);
}
于 2012-09-26T15:56:09.200 に答える