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真的是一个二维数组,n现在设置为两个维度中较小者的长度。如果blocks是 Nd 数组...为什么要计算这个值?

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

在这里,您似乎假设这blocks 是二维的。但是您还假设最大维度是第二个维度(请注意,如果您设置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++ 以行优先顺序存储数组,所以你不是在这里对第一行求和,而不是对最后一行求和吗?假设您的 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 回答