Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Matlab'有效地将数据附加到变量;SCAPI_Matlab - Fatal编程技术网

使用Matlab'有效地将数据附加到变量;SCAPI

使用Matlab'有效地将数据附加到变量;SCAPI,matlab,Matlab,我有一个C程序,它反复执行一个算法,并在每次迭代后输出其中间结果。数据将使用Matlab R2019a进行处理 我正在使用创建.MAT文件,我可以将矩阵写入.MAT文件: MATFile*m=matOpen(“matlab.MAT”,“w”); mxArray*a=mxCreateDoubleMatrix(1,1,mxREAL); *mxGetPr(a)=nxm; matPutVariable(m,“nxm”,a); MX阵列(a); matClose(m); 但是,[maxPutVariab

我有一个C程序,它反复执行一个算法,并在每次迭代后输出其中间结果。数据将使用Matlab R2019a进行处理

我正在使用创建.MAT文件,我可以将矩阵写入.MAT文件:

MATFile*m=matOpen(“matlab.MAT”,“w”);
mxArray*a=mxCreateDoubleMatrix(1,1,mxREAL);
*mxGetPr(a)=nxm;
matPutVariable(m,“nxm”,a);
MX阵列(a);
matClose(m);
但是,
[maxPutVariable]的文档(https://www.mathworks.com/help/matlab/apiref/matputvariable.html)
指出,如果我使用同一个变量名两次,第二个变量名将覆盖第一个变量名

我不想在内存中存储所有中间值。也许我可以读入矩阵,扩展它以包含一个新的值,然后再写出来


有没有一种合适的方法可以使用C API实现这一点,或者我应该编写Matlab代码来解析不同的输出格式?

您可以在一个MAT文件中保存多个命名变量。当您向MAT文件添加一个新变量时,它会附加到文件的末尾,因此即使现有文件相对较大,这对I/O来说也不错。因此,我要做的是让C程序的每个循环迭代将其输出存储到MAT文件中一个名为
nxm
的新变量中,然后让Matlab程序读取该文件并将它们连接在一起

在您的C代码中:

MATFILE *m = matOpen("matlab.mat", "w");
[...]
char var_name[1024];
for (i = 0; i < n_iterations; i++) {
  [... do work to produce nxm ...]
  mxArray *a = mxCreateDoubleMatrix(1, 1, mxREAL);
  *mxGetPr(a) = nxm;
  sprintf(var_name, "nxm%d", i);
  matPutVariable(m, var_name, a);
  mxDestroyArray(a);
}
matClose(m);
您还可以编写代码,以便每个过程读取前一个过程的输出,扩展数组,并将其写回同一个命名变量。但是如果中间结果是大的,而不是这些单个的数字,那么用C进行编码会多得多,而且(我认为)性能会差一些


就这一点而言,因为它看起来像是在处理一个小数据集-
nxm
是一个标量
double
-您可以将
fprintf(“%d\n”,nxm)
您的nxm值保存到一个文本文件中,每行只有一个数字,然后使用
fscanf
str2double

将其读入Matlab。您可以在单个MAT文件中保存多个命名变量。当您向MAT文件添加一个新变量时,它会附加到文件的末尾,因此即使现有文件相对较大,这对I/O来说也不错。因此,我要做的是让C程序的每个循环迭代将其输出存储到MAT文件中一个名为
nxm
的新变量中,然后让Matlab程序读取该文件并将它们连接在一起

在您的C代码中:

MATFILE *m = matOpen("matlab.mat", "w");
[...]
char var_name[1024];
for (i = 0; i < n_iterations; i++) {
  [... do work to produce nxm ...]
  mxArray *a = mxCreateDoubleMatrix(1, 1, mxREAL);
  *mxGetPr(a) = nxm;
  sprintf(var_name, "nxm%d", i);
  matPutVariable(m, var_name, a);
  mxDestroyArray(a);
}
matClose(m);
您还可以编写代码,以便每个过程读取前一个过程的输出,扩展数组,并将其写回同一个命名变量。但是如果中间结果是大的,而不是这些单个的数字,那么用C进行编码会多得多,而且(我认为)性能会差一些


就这一点而言,因为它看起来像是在处理一个小数据集-
nxm
是一个标量
double
-您可以将
fprintf(“%d\n”,nxm)
您的nxm值保存到一个文本文件中,每行只有一个数字,然后使用
fscanf
str2double

将其读入Matlab。MAT文件格式对于数值数组数据非常有效。你的中间结果有多大?这里的I/O性能至关重要吗?当你的C程序还在运行时,你的下游Matlab进程是否需要处理一些结果,或者它是否可以等到C程序完成后立即处理所有结果?(我暂时认为您应该将每个中间结果放入一个不同的
nxmnn
变量,其中
NNNN
是您的循环索引或其他什么,然后将其读入Matlab,让它只
cat()
所有
nxmnn
变量;这只是几行代码。)MAT文件格式对于数值数组数据非常有效。中间结果有多大?这里的I/O性能是否至关重要?您的下游Matlab进程是否需要在C程序仍在运行时处理一些结果,还是可以等到C程序完成后立即处理所有结果?(我暂时认为您应该将每个中间结果放入一个不同的
nxmnn
变量,其中
NNNN
是您的循环索引或其他什么,然后将其读入Matlab,让它只
cat()
所有
nxmnn
变量;这只是几行代码。)谢谢。假设我在同一个文件中有多个数组,比如
nxm
nym
。我可以用这种方式连接所有
nxm\u I
nym\u j
吗?是的。让你的Matlab代码执行
s=load(…);vars=fieldnames(s);
获取所有变量的列表,然后使用
regexp
startsWith
检测文件中存储的哪些变量与这些模式匹配,并且应该按组连接到不同的输出变量中。或者,如果您甚至事先不知道文件中所有变量的名称,请使用
targetet_var=regexprep(vars,'...*')
要将文件变量名映射到目标代码变量名,请调用
unique(target_var)
以获取结果“压缩”变量的列表,并使用
ismember(target_var,vars)
来决定应该将文件中的哪些输入变量连接起来以生成每个压缩输出变量。谢谢。假设我在同一个文件中有多个数组,如
nxm
nym
。我可以用这种方式连接所有
nxm\u I
nym\u j
吗?是的。让你的Matlab代码执行
s=load(…);vars=fieldnames(s);
获取所有变量的列表,然后使用
regexp
startsWith
检测文件中存储的哪些变量与这些模式匹配,并且应按组连接到不同的输出变量。或者