Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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 如何从不同的文件打印到同一个文件进行迭代?_Matlab_File_Parfor - Fatal编程技术网

Matlab 如何从不同的文件打印到同一个文件进行迭代?

Matlab 如何从不同的文件打印到同一个文件进行迭代?,matlab,file,parfor,Matlab,File,Parfor,考虑以下一对函数: function fileTop test = fopen('test.txt','w'); fprintf(test,'In function "fileTop"\r\n'); fileMid(test) fprintf(test,'Back in function "fileTop"'); fclose(test); end 以及: 如果您刚刚运行fileTop,您将获得一个新的文本文件(如果是第一次),其中包含以下内容: In function "fileTop" I

考虑以下一对函数:

function fileTop
test = fopen('test.txt','w');
fprintf(test,'In function "fileTop"\r\n');
fileMid(test)
fprintf(test,'Back in function "fileTop"');
fclose(test);
end
以及:

如果您刚刚运行
fileTop
,您将获得一个新的文本文件(如果是第一次),其中包含以下内容:

In function "fileTop"
In "fileMid 1" at 736847.920072
In "fileMid 2" at 736847.920073
In "fileMid 3" at 736847.920081
In "fileMid 4" at 736847.920087
In "fileMid 5" at 736847.920096
Back in function "fileTop"
这很好

现在,尝试将
fileMid
中的循环更改为
parfor
,您会得到一个错误:

使用fileMid时出错(第2行)
无效的文件标识符。使用fopen生成有效的文件标识符

有办法解决这个问题吗


顺便说一句,我不在乎迭代的打印顺序。

上面代码中的问题是,在第一次访问该文件后,我试图将其
fid
传递给工作人员,但他们无法连接主程序,因此他们发现
fid
的文件无法访问

解决这个问题的方法是,将文件名本身传递给worker,然后在每个worker中打开和关闭文件,尽管我不确定是否推荐使用该方法。这就是更改后的
fileTop
外观:

function fileTop
file_name = 'test.txt';
test = fopen(file_name,'w');
fprintf(test,'In function "fileTop"\r\n');
fclose(test);
parfor k = 1:5
    fileMid(test,k)
end
test = fopen(file_name,'a');
fprintf(test,'Back in function "fileTop"');
fclose(test);
end
这是
fileMid

function fileMid(file_name,k)
test = fopen(file_name,'a');
pause(rand)
fprintf(test,'In "fileMid %d" at %f\r\n',k,now);
fclose(test);
end
可能的结果是:

In function "fileTop"
In "fileMid 2" at 736847.917401
In "fileMid 4" at 736847.917404
In "fileMid 3" at 736847.917405
In "fileMid 1" at 736847.917409
In "fileMid 5" at 736847.917410
Back in function "fileTop"

让多个进程修改同一资源通常是不明智的。如果这两个进程恰好在同一时间写入文件,则可能会导致它们的输出交叉或相互覆盖

更好的办法是让每个工作进程输出到自己的唯一文件,例如文件名加上工作进程唯一的标识符。使用时,可以从以下位置获取此标识符:

或在使用时从:


然后,工作线程完成后,让主进程将各个数据文件收集到一个文件中。

如果允许工作线程写入同一文件,则此处的工作线程可能会覆盖彼此的输出。也许这取决于操作系统。它们不会覆盖,只是以不可预测的顺序追加行,这在我的例子中不是问题。如果两个过程在一秒钟内结束,你可能是对的,但我没有遇到过这种情况。不过,我同意这不是最佳做法。
In function "fileTop"
In "fileMid 2" at 736847.917401
In "fileMid 4" at 736847.917404
In "fileMid 3" at 736847.917405
In "fileMid 1" at 736847.917409
In "fileMid 5" at 736847.917410
Back in function "fileTop"
[filePath, fileName, fileExt] = fileparts(file_name);
workerFile = fullfile(filePath, [file_name '_' int2str(labindex) fileExt]);
[filePath, fileName, fileExt] = fileparts(file_name);
task = getCurrentTask;
workerFile = fullfile(filePath, [file_name '_' int2str(task.ID) fileExt]);