繁体   English   中英

计算能量的问题

[英]Problems Calculating Energy

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

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

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

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

len = length(blocks);

很容易,你抓住“矢量长度或最大阵列维度”

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

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

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 ++以行主顺序存储数组,所以你不是在这里总结第一行而不是最后一行? 假设您的MATLAB代码确实在做您想要的,我认为您需要以下内容:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM