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 - Fatal编程技术网

如何等待在Matlab上写入或删除文件?

如何等待在Matlab上写入或删除文件?,matlab,file,Matlab,File,问题 我正在运行一个Matlab脚本,该脚本创建存储在“.m”文件中的网格几何体;所有这些都是用于使用有限元解算器运行的。我给它一些元素,它创建了一个适合边界的四边形网格;图1和图2中显示了两个几何体示例。当我只对单个元素使用它时,它工作得非常好。另一方面,当我尝试在循环中使用网格生成脚本,改变所需元素的数量(n=1,2,4,…32,64)时,文件的读取方式就像我在n=1时运行它一样。就好像“.m”文件没有被重写一样 图1。包含10个四边形单元的网格 图2。包含40个四边形单元的网格 当前方

问题

我正在运行一个Matlab脚本,该脚本创建存储在“.m”文件中的网格几何体;所有这些都是用于使用有限元解算器运行的。我给它一些元素,它创建了一个适合边界的四边形网格;图1和图2中显示了两个几何体示例。当我只对单个元素使用它时,它工作得非常好。另一方面,当我尝试在循环中使用网格生成脚本,改变所需元素的数量(n=1,2,4,…32,64)时,文件的读取方式就像我在n=1时运行它一样。就好像“.m”文件没有被重写一样

图1。包含10个四边形单元的网格

图2。包含40个四边形单元的网格

当前方法

for i = 1:4
    n = 2^i % n stores the desired number of elements (2^i is only an example)
    % Check if '.m' file exists in current directory
    allFiles = dir(currentFolder)
    allNames = {allFiles.name}
    check = ismember('p4.m',allNames);
    % If so, delete the file
    if check
        delete 'p4.m'
    end
    % Create the 'p4.m' file
    p4Mesh(n)
end
p4Mesh函数摘要:

function p4Mesh
close all; 
inputfile = 'p4.m'; 
% open file 
fid = fopen(inputfile,'w'); 
fprintf(fid,'MESH CODE HERE') 
% Close file
[st] = fclose('all'); 
end
总结
p4
函数定义可能正在被缓存,因此在后续调用
p4()
时,您不会获取写入磁盘的新版本。使用
clear p4
删除缓存的定义,并在每次更新时强制其重新读取
p4.m

细节 您可能会遇到Matlab函数定义缓存的问题。当您第一次调用函数或类时,Matlab会从磁盘上的
.m
文件中读取定义,对其进行编译并运行,然后将编译后的定义缓存。由于fopen/fprintf/fclose是同步的,而Matlab是单线程的,因此文件编写不太可能滞后于Matlab循环。但是Matlab的函数加载机制可能没有像您需要的那样快速地注意到磁盘上的变化

如果Matlab注意到磁盘上的函数定义已更改,它将重新读取函数定义。如果从Matlab编辑器保存函数文件,它会立即注意到更改,因为更改是通过Matlab进行的。但是,如果您从代码中编写文件的内容,在Matlab看来,这就像是一个外部更改。Matlab以依赖于系统的方式获取关于这些更改的更新,比如从操作系统获取文件更改通知事件,或者定期轮询文件系统以检查文件时间戳。有关此操作的详细信息,请参阅
文档更改通知
文档更改通知高级

由于您在一个紧密的循环中编写文件,因此更新可能发生得太快,以至于Matlab的更改通知无法注意到。事实上,Matlab可能会延迟文件更新检查,直到它运行完用户函数(出于性能和一致性原因),因此可能根本不会执行更新检查,直到它完成了循环并从该脚本返回到命令行。在这种情况下,如果在循环中多次调用
p4()
,每次都会使用第一次传递的缓存函数定义,并且您会看到函数的相同输出。这听起来像你所描述的

诊断 要查看这是否是实际发生的情况,请检查磁盘上
p4.m
文件的内容,并将其作为Matlab函数调用。您可以使用许多系统上可用的
md5sum
程序输出一行校验和。或者,您可以调用
cat
,或者使用fopen/fread/fclose重新读取它,然后从Matlab中将它或它的md5校验和打印到控制台。如果每次通过时文件在磁盘上看起来不同,但调用
p4()
时得到的输出相同,则可能是函数缓存

固定 通过使用
clear
命令从内存中删除其缓存的编译定义,可以强制Matlab从磁盘上的当前
.m
文件中重新读取函数。在这种情况下,执行
清除p4p4mesh
写出
p4.m
文件之后,以及再次调用
p4
之前,循环的每一次过程中都会出现code>

在循环中执行
pause
drawnow
也可以让Matlab的函数缓存机制有机会注意到磁盘上更新的
.m
文件。但是
clear p4
应该更加可靠和确定,因为它每次都会强制重新读取


从长远来看,如果你能让你的教授给你一个生成
.mat
数据文件的
p4mesh
,而不是像评论员建议的那样生成
.m
函数定义文件,可能会更好。
.mat
数据文件更适合快速更改的定义,并且没有缓存问题。

您确定要在每次迭代时删除该文件吗?@G.J我真的不必删除它们。我只是想看看这是否有帮助。它不…如何在P4Mesh函数中编写.m文件这里有一个摘要:全部关闭;inputfile='p4.m';%打开文件fid=fopen(输入文件,'w');fprintf(‘此处的网格代码’)[st]=fclose(‘全部’)@MHM您希望用
'p4.m'
编写什么?您在
p4mesh
中根本没有使用文件句柄??使用“clear p4.m”命令清除缓存效果非常好。我很感谢你花时间帮忙。太好了。如果这能解决你的问题,你介意接受答案吗?