首先,我不确定您为什么将向量元素的绝对值之和称为“能量”。我本来期望“能量”是元素的平方和(或者范数的平方和,如果这是一个复向量)。
其次,这让我觉得代码相当愚蠢(相信我,我知道愚蠢的代码;-))。逐行查看:
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]);
}