- html - 我的下拉菜单的内容关闭得太快
- c# - 使用 Html Agility Pack 从网页中的表中获取值而不使用 "SelectNode'
- html - 内容容器下的 CSS 下拉菜单
- html - 如何停止嵌套列表重叠父列表?
我正在尝试在不使用集成编码器的情况下将 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/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!