计算能量的问题

时间:2012-09-25 13:46:20

标签: c++ matlab

我需要计算向量的能量,我可以通过以下方式在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

希望有人可以对此有所了解:)

1 个答案:

答案 0 :(得分:2)

首先,我不确定你为什么把矢量元素的绝对值之和称为“能量”。我本来期望“能量”是元素的 square 的总和(或者是规范的平方和,如果这是一个复杂的向量)。

其次,这对我来说是相当愚蠢的代码(相信我,我知道愚蠢的代码;-))。逐行看待它:

len = length(blocks);

很简单,你抓住了"length of vector or largest array dimension"

n = sum(size(blocks)) - len;

在你的问题中,你说你在计算“向量”中的能量,但如果blocks实际上是一个向量,那么这将总是返回数字1,那么为什么还要计算呢?如果blocks实际上是二维数组,则n现在设置为两个维度中较小者的长度。如果blocks是N-d数组...为什么要计算这个值?

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

在这里,您似乎假设blocks是2-D。但是你也假设最大的维度是第二个维度(请注意,如果将blocks设置为zeros(10,3)之类的数组或列向量,则此行代码将失败。

鉴于你的隐含假设(blocks是一个二维数组,最后一个维度是最后一个),你可以用以下代码替换所有这些代码:

currsum = sum(abs(blocks(end,:)))

现在更清楚的是发生了什么,但为什么要计算数组中最后一行的绝对值之和?也许那真的是你想要的,但对我来说似乎很奇怪。

查看您的C ++代码:

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

为什么不说:

int n = this->height;

然后,在循环内你有

currsum += blocks[i];

首先,你为什么不打电话给abs()?其次,C和C ++以行主顺序存储数组,所以你不是在这里总结第一个行,而不是 last 行?假设你的MATLAB代码真正做你想要的,我想你想要的东西是:

double currsum = 0;
for(int i=0; (i < this->width); i++)
{
    currsum += abs(blocks[this->height-1][i]);
}