不同文件之间的数据读取计算

昵称是咩呀 2012-08-06 08:00:45
现在有两个文件里的两组数据如下:
第一组:
-19.364 -22.875 3.812
-19.453 -21.997 4.220
-18.174 -22.995 4.151
-17.881 -23.176 4.813
-17.888 -23.234 4.807
-17.802 -22.737 4.677
-18.453 -22.757 4.771
-18.198 -22.330 4.963
-18.226 -23.227 4.502
-18.402 -23.224 4.252
-18.3841 -22.8552 4.4968
第二组:
-16.222 -21.012 5.142
-15.791 -21.018 4.819
-14.954 -21.074 4.887
-14.666 -21.329 5.388
-14.538 -21.442 5.375
-14.614 -20.902 5.623
-15.061 -20.928 5.336
-14.907 -20.558 5.109
-15.063 -21.157 4.960
-15.383 -21.118 4.830
-15.1199 -21.0538 5.1469
每一组的前面10行是一个原子不同时间的坐标,最后一行是坐标的平均值,第二组数据结构同第一组,并且时间上两组数据的每一行有一一对应的关系,现在我想让第一组的第i行(i=1,2,3...10)与平均值做差,然后乘以第二组的第i行与平均值的差,然后把所有的值加起来求平均值,请问大家该如何写程序,谢谢!
...全文
102 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
muyi66 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

差?你的意思是要求出每一行坐标与平均值点之间的距离,然后将两组的距离对应着相乘?

这个应该很容易啊......或者说我理解错了?

是的!
[/Quote]分别打开两个文件,跳过前面的数据直到读到平均值,将其保存起来。

然后重置文件指针到文件起始位置,进入循环重新逐行读出数据,计算距离及乘积,将其输出到目标文件。同时记录总和及坐标数,用之在循环结束后计算出平均数。

最后将平均数输出到目标文件,任务结束。
昵称是咩呀 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

差?你的意思是要求出每一行坐标与平均值点之间的距离,然后将两组的距离对应着相乘?

这个应该很容易啊......或者说我理解错了?
[/Quote]
是的!
昵称是咩呀 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

根据你的问题,写了一个例子,代码如下:
C/C++ code
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cassert>

// 定义类来表述每一行……
[/Quote]
谢谢!
muyi66 2012-08-06
  • 打赏
  • 举报
回复
差?你的意思是要求出每一行坐标与平均值点之间的距离,然后将两组的距离对应着相乘?

这个应该很容易啊......或者说我理解错了?
blldw 2012-08-06
  • 打赏
  • 举报
回复
根据你的问题,写了一个例子,代码如下:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cassert>

// 定义类来表述每一行数据
class Point {
friend Point multiply(const Point& pt1, const Point& pt2);
friend std::ostream& operator<<(std::ostream& os, const Point& pt);

public:
Point() : _x(0), _y(0), _z(0) {}
Point(double x, double y, double z) : _x(x), _y(y), _z(z) {}

// 根据需要重载运算符
Point& operator-=(const Point& rh) {
_x -= rh._x;
_y -= rh._y;
_z -= rh._z;

return (*this);
}

Point& operator/=(double n) {
_x /= n;
_y /= n;
_z /= n;

return (*this);
}

Point operator+(const Point& pt) const {
double x = _x + pt._x;
double y = _y + pt._y;
double z = _z + pt._z;

return Point(x, y, z);
}

private:
double _x;
double _y;
double _z;
};

// 定义函数对象,减操作
class Minus_value {
public:
Minus_value(Point val) : _val(val) {}

void operator()(Point& elem) {
elem -= _val;
}

private:
Point _val;
};

// 乘操作
Point multiply(const Point& pt1, const Point& pt2)
{
double x = pt1._x * pt2._x;
double y = pt1._y * pt2._y;
double z = pt1._z * pt2._z;

return Point(x, y, z);
}

// 输出Point对象
std::ostream& operator<<(std::ostream& os, const Point& pt)
{
os << "(" << pt._x << ", " << pt._y << ", " << pt._z << ")";
return os;
}

int main(int, char**)
{
std::ifstream infile1("1.txt");
std::ifstream infile2("2.txt");
if (!infile1 || !infile2) {
std::cout << "cann't open file." << std::endl;
return -1;
}

std::string tmp_str;

// 读取文件1内容
std::vector<Point> dvec1;
while (std::getline(infile1, tmp_str)) {
std::istringstream is(tmp_str);
double x, y, z;
is >> x >> y >> z;
dvec1.push_back(Point(x, y, z));
}

// 读取文件2内容
std::vector<Point> dvec2;
while (std::getline(infile2, tmp_str)) {
std::istringstream is(tmp_str);
double x, y, z;
is >> x >> y >> z;
dvec2.push_back(Point(x, y, z));
}

infile1.close();
infile2.close();

assert(11 == dvec1.size() && 11 == dvec2.size());

// 第一组数据的前10行,每一行减去第11行
std::for_each(dvec1.begin(), dvec1.begin() + 10,
Minus_value(dvec1[10]));

// 第二组数据的前10行,每一行减去第11行
std::for_each(dvec2.begin(), dvec2.begin() + 10,
Minus_value(dvec2[10]));

// 以上结果相乘,结果存入multi_result
std::vector<Point> multi_result;
std::transform(dvec1.begin(), dvec1.begin() + 10, dvec2.begin(),
std::back_inserter(multi_result), multiply);

// 求和
Point sum;
sum = std::accumulate(multi_result.begin(), multi_result.end(), Point());

// 求平均值
Point avg = sum /= 10;

// 输出结果
std::cout << avg << std::endl;

return 0;
}

希望对你有帮助。
鼓励针对C++中的一些应用方面或理解方面提针对性较强的问题,不提倡提一个问题,问如何写程序。
titer1 2012-08-06
  • 打赏
  • 举报
回复
要是用matlab,
或者说 懂点矩阵编程,就有好思路哈。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧