我需要计算向量的能量,我可以通过以下方式在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
希望有人可以对此有所了解:)
答案 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]);
}