我有一个。csv文件,看起来像:
X,Y,Z
0,0,0
0,0,0
-0.00624347,-0.0182673,1.00063
-0.00845628,-0.0374925,1.00058
-0.00494793,-0.0295639,0.927447
-0.00285682,-0.0926582,0.885783
-0.00832563,-0.02957,0.697834
,我想把它放入三个gsl_vectors(来自GSL: https://www.gnu.org/software/gsl/doc/html/vectors.html)中,分别对应于X列、Y列和Z列。我想这样做的原因是因为我以后想使用GNU科学库中对这些数据实现的函数。我要强调的是,这些函数只能在gsl_vectors上工作,而不能在std:vectors上工作。
我的方法:
将。csv中的数据转换为std:vectors,然后将这些vector转换为gsl_vectors。
将。csv文件中的数据直接放入gsl_vectors中:
#include <iostream> #include <fstream> #include <istream> #include <string> #include <sstream> #include <algorithm> #include <gsl/gsl_linalg.h> #include <gsl/gsl_vector.h> struct acceleration { gsl_vector AccX; gsl_vector AccY; gsl_vector AccZ; }; // Function prototypes acceleration read_csv(acceleration& A); // End function prototypes int main(void) { // ==================READ THE CSV========================= acceleration data; data = read_csv(data); printf("/n"); gsl_vector_fprintf(stdout, &data.AccX, "%lf"); return 0; } acceleration read_csv(acceleration& SA) { std::string buffer; /* Declare a buffer for the data that will be read */ std::string bacx, bacy, bacz; std::ifstream inputfile; inputfile.open("buffer.csv"); /* Open file for reading */ if (!inputfile.is_open()) { std::cout << "Error opening file" << std::endl; } std::stringstream aux(buffer); getline(aux, bacx, ','); getline(aux, bacy, ','); getline(aux, bacz, ','); size_t i{ 0 }; while (getline(inputfile, buffer)) { std::stringstream aux(buffer); getline(aux, bacx, ','); if (bacx.compare("AX") != 0) gsl_vector_set(&SA.AccX, i, stod(bacx)); getline(aux, bacy, ','); if (bacy.compare("AY") != 0) gsl_vector_set(&SA.AccY, i, stod(bacy)); getline(aux, bacz, ','); if (bacz.compare("AZ") != 0) gsl_vector_set(&SA.AccZ, i, stod(bacz)); i++; } inputfile.close(); return (SA); }
这在控制台上没有输出,如果我调试它,函数
gsl_vector_set
抛出一个异常:在program .exe中的0x7A5EED1A (gsld.dll)抛出异常:0xC0000005:访问冲突写入位置0x3333332
在
gsl_set_vector
的线上:v->data[i * v->stride] = x;
将.csv数据放入gsl_block中,然后将其切片为gsl_vectors。在这里,当我试图将数据放入块中时,我得到了一个异常。然后,为了将块切成向量,我假设我必须使用
gsl_vector_alloc_from_block()
函数,但是我没有找到关于如何使用此函数的任何示例。我确实需要了解其他人是如何使用函数的,因为我是c++的新手。以下是我到目前为止对这个想法的看法:#include <iostream> #include <fstream> #include <gsl/gsl_linalg.h> #include <gsl/gsl_vector.h> // Function prototypes gsl_block read_csv(void); // End function prototypes int main(void) { // ================== READ THE CSV INTO A BLOCK ========================= gsl_block data; data = read_csv(); // ================= NOW SLICE THE BLOCK: HOW? ========================== // Use gsl_vector_alloc_from_block(), but how? return 0; } // Function declarations gsl_block read_csv(void) { FILE* inputfile; fopen_s(&inputfile, "buffer.csv", "r"); /* Open file for reading */ if (inputfile == NULL) std::cout << "file does not exist n"; fseek(inputfile, 0L, SEEK_END); // Go until the end int file_size = ftell(inputfile); // In order to tell the size of the file gsl_block* b = gsl_block_alloc(file_size); if(inputfile) gsl_block_fscanf(inputfile, b); fclose(inputfile); return *b; } // End function declarations
如果我运行这个,我得到:
调试错误!Abort()被调用
在控制台上显示:
gsl: C:DEVvcpkgbuildtreesgslsrcgsl-2-fb511965d5.cleanblockfprintf_source.c:90: ERROR: fscanf失败调用默认的GSL错误处理程序。
如果我调试这个,
gsl_error
函数抛出一个异常:prop .exe触发断点。
At
abort ();
总之,我实际上想将.csv文件读取到gsl_vectors中。如果我的方法不好,也是可以理解的。
您可以通过以下方式将CSV文件读取为gsl矢量:
#include <stdio.h>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <gsl/gsl_vector.h>
int main ()
{
int i = 0, rows = 7;
// Allocate vectors
gsl_vector *X = gsl_vector_alloc (rows);
gsl_vector *Y = gsl_vector_alloc (rows);
gsl_vector *Z = gsl_vector_alloc (rows);
// Open the file
std::ifstream openfile("data.csv");
openfile.ignore(10000, 'n'); // Ignore the header
std::string line;
while (getline(openfile, line, 'n'))
{
std::string a, b, c;
std::stringstream iss(line);
getline(getline(getline (iss, a, ','), b, ','), c, ',');
// std::cout << a << ' ' << b << ' ' << c << std::endl;
// Set vectors
gsl_vector_set (X, i, std::stod(a));
gsl_vector_set (Y, i, std::stod(b));
gsl_vector_set (Z, i, std::stod(c));
i += 1;
}
// Close the file
openfile.close();
for(i = 0; i < rows; ++i)
{
// Get vectors
std::cout << gsl_vector_get (X, i) << "t";
std::cout << gsl_vector_get (Y, i) << "t";
std::cout << gsl_vector_get (Z, i) << "n";
}
// Do some processing with the vectors
// Free allocated memory at the end
gsl_vector_free (X);
gsl_vector_free (Y);
gsl_vector_free (Z);
return 0;
}
首先,我使用ifstream
打开data.csv
,并将每行读取为三个变量(通过逗号分隔它们)。其次,我将它们转换为double
并将它们存储在gsl向量中。最后,我打印它们以进行验证。