- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在不使用集成编码器的情况下将 MATLAB 模拟转换为 C 语言,以尝试自学 C 语言。在 MATLAB 中要导入和使用 Excel/csv 文件中的数据,您可以使用 GUI 手动将数据导入到您可以在其中另存为 .mat 文件并使用其中的变量,或者不推荐的方法是使用“csvread”。我正在尝试在 C 中执行类似的操作。
我可以使用下面的代码从 csv 文件(720 行 x 3 列)获取数据,但是我很难将数据从 load_PV
函数传递到 main()
函数的输出数据是一个多维数组。我的主要问题是这是否是最好的方法并追求它,或者我是否可以/应该创建一个函数,将每列单独加载为循环中的新变量并将其传递给 main() 函数
#include<stdio.h>
#include<string.h>
#include<stdint.h>
#include<stdlib.h>
float CA[720];
float P[720];
float V[720];
//~ static float ARRAY[720];
float load_PV(int r, int c, float DATA[720][3])
{
char buf[720];
//~ static float ARRAY[720];
FILE *fp = fopen("PV_Data.csv", "r");
if(!fp)
{
printf("Could Not Open File\n");
}
int i = 1;
while(fgets(buf, 720, fp))
{
CA[i] = atof(strtok(buf, ","));
P[i] = atof((strtok(NULL, ",")));
V[i] = atof((strtok(NULL, ",")));
DATA[i][1] = CA[i];
DATA[i][2] = P[i];
DATA[i][3] = V[i];
i++;
}
//~ printf("%f\n", ARRAY[540][3]);
return(DATA[720][3]);
}
int main()
{
int r = 720;
int c = 3;
float DATA[r][c];
float data = load_PV(r, c, DATA[720][3]);
printf("%f\n", data);
//~ int i = 1;
//~ for(i = 1; i<=720; i++);
//~ {
//~ printf("%f", data[i][1]);
//~ printf("\t");
//~ printf("%f", data[i][2]);
//~ printf("\t");
//~ printf("%f\n", data[i][3]);
//~ }
}
由于我对 C 不太熟悉(你能告诉我吗?:P),我预计输出只是一个 720x3 float 组,但是在编译时我收到以下错误消息;
gcc -Wall -o "Test2" "Test2.c" (in directory: C:\Users\Student\Dropbox\C Projects\MATLAB_to_C)
Test2.c: In function 'main':
Test2.c:47:29: error: incompatible type for argument 3 of 'load_PV'
float data = load_PV(r, c, DATA[720][3]);
^
Test2.c:11:8: note: expected 'float (*)[3]' but argument is of type 'float'
float load_PV(int r, int c, float DATA[720][3])
^
Compilation failed.
我对指针不太熟悉,因为它们是我正在尝试学习的 C 的方面之一,我已经看到你可以用它们来完成此任务,但我没有完全理解这些示例,所以还没有使用它们,因为我正在努力学习而不是复制。那么这种方法有效还是另一种更广泛使用的方法?
附注这不是一个家庭作业问题。我刚从大学毕业,看到更多的公司正在寻找 C 而不是 MATLAB,所以尝试学习以供将来发展。这是一项爱好/专业发展练习
最佳答案
在第一次迭代中,您可以编写如下内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
float CA;
float P;
float V;
} Entry;
#define ROWS 720
Entry *load_PV() {
char buf[1024];
FILE *fp;
if ((fp = fopen("PV_Data.csv", "r")) == NULL) {
printf("Could Not Open File\n");
exit(-1);
}
Entry *entries = malloc(sizeof(Entry) * ROWS);
for (int i = 0; i < ROWS && fgets(buf, sizeof(buf), fp); i++) {
entries[i].CA = atof(strtok(buf, ","));
entries[i].P = atof((strtok(NULL, ",")));
entries[i].V = atof((strtok(NULL, ",")));
}
fclose(fp);
return entries;
}
int main() {
Entry *entries = load_PV();
for (int i = 0; i < ROWS; i++) {
Entry entry = entries[i];
printf("%f %f %f\n", entry.CA, entry.P, entry.V);
}
free(entries);
return 0;
}
更改
更加动态和稳健的解决方案
上面的代码是第一次迭代,但它可能不像您希望的那样动态和健壮,即使对于爱好练习项目也是如此。
那么应该/可以改进什么:
那么第二次迭代中的代码可能如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int load_PV(float **dataPtr, int r, int c) {
char buf[1024];
FILE *fp;
if ((fp = fopen("PV_Data.csv", "r")) == NULL) {
fprintf(stderr, "Could Not Open File\n");
exit(-1);
}
float *data = calloc(r * c, sizeof(float));
if (!data) {
*dataPtr = NULL;
return 0;
}
*dataPtr = data;
int row = 0;
for (row = 0; row < r && fgets(buf, sizeof(buf), fp); row++) {
char *token = strtok(buf, ",");
if(token) {
data[row * c] = strtof(token, NULL);
for (int col = 1; col < c; col++) {
token = strtok(NULL, ",");
if(token) {
data[row * c + col] = strtof(token, NULL);
} else {
fprintf(stderr, "missing value in row %d\n", row);
}
}
} else {
fprintf(stderr, "missing value in row %d\n", row);
}
}
fclose(fp);
return row;
}
int main() {
int r = 720;
int c = 3;
float *data;
int number_of_Rows = load_PV(&data, r, c);
for (int i = 0; i < number_of_Rows; i++) {
float *rowData = &data[i * c];
printf("[%d]: ", i);
for(int col = 0; col < c; col++) {
printf("%f ", rowData[col]);
}
printf("\n");
}
if(data) {
free(data);
}
return 0;
}
那么它是如何工作的呢?
在 main 中有一个名为 data to float 的指针。该指针的地址与维度(行/列)一起传递给load_PV。在那里, float 的内存被动态分配并用零填充。为每行读取指定数量的 float 。如果数据丢失,则会向 stderr 写入一条消息。返回行数。然后将数据简单地输出到 main 中的控制台,同时考虑尺寸。最后,动态分配的数据被释放。
进一步迭代
代码可以进一步改进,例如文件名应该是函数参数。您应该检查浮点是否可以读取或是否存在转换错误。但这段代码仍然可能是一个很好的起点。
关于c - 以与 C 语言中的 MATLAB 类似的方式从 .csv 文件加载的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56618065/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!