如何解决手动计算范数
我有下面显示的这段代码,它应该手动计算随机生成的向量的范数。但是,我一直将输出打印到终端为 0。为什么会这样?
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
double Computenorm(const vector<double>& x) {
double result = 0.0;
for (auto a : x) {
double result = result + a*a;
}
return sqrt(result);
}
int main() {
// Declare variables
#if 0
int n;
cin >> n
#else
int n = 1000;
#endif
if (n == 0) {
cout << "N must be > 0" << endl;
}
vector<double> x(n,0.0);
// Seed the random number generate with the current epoch time
srand(time(0));
// Generate random numbers and print them to the screen
generate(x.begin(),x.end(),[] { return (double)rand()/RAND_MAX; });
// Print out the values computed by BLAS and manually
// cout << "BLAS norm: " << cblas_dnrm2(n,&x[0],1) << endl;
cout << "Manual norm: " << Computenorm(x) << endl;
// cout << "x(n): " << x[n] << endl;
return 0;
}
解决方法
double result = result + a*a;
这在循环内声明了一个新变量,因此另一个 result
变量不会改变,这就是返回 0 的原因。
要修复它,只需执行 result = result + a*a
或 result += a*a
:
double ComputeNorm(const vector<double>& x) {
double result = 0.0;
for (auto a : x) {
result = result + a*a;
}
return sqrt(result);
}
,
在 ComputeNorm
函数的 for 循环中,您在每次迭代中都重新声明了 result
,而循环外的 result
从未改变。
相反,您可能希望 result = result + a*a
在那里。
我无法评论,因为我没有足够的声誉,但我想评论的是,您在函数 `ComputeNorm 中两次声明了局部变量 result
。
这可能是您问题的根源。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。