Matfile 未加载结构的字段名称
Matfile isn't loading the structure's field names
背景
我在 Matlab 2016b 中遇到函数 "matfile" 的一些奇怪行为 - 不确定发生了什么,我无法复制它或创建测试用例。
我有一个结构,我将其保存到服务器,如下所示:
PathToFile='ServerPath\My Documents\MyProj\testMatF.mat';
save(PathToFile,'-struct','myStruct'); %I tried the -v7.3 flag
问题
然后我读入:
m1=matfile(PathToFile);
在其他非常相似的结构上,我可以这样做:
myFields=fieldnames(m1);
但是对于这个文件我不能,我得到的只是自动 "Properties" 字段。
我试过的
myFields=who(m1)
- 给我字段名列表......有时。我不太了解 who
的功能,但似乎,如果我穿插 who m1
然后 myFields=who(m1)
就可以了。
显式键入 m1.TheFieldName
,有效。
将文件移动到 comp 上的某个位置,如 C:\Data\
。然后使用 fieldnames
工作。
使用 load
,有效。
是否与服务器访问、损坏的文件、matfile 属性有关?另一件奇怪的事情是我在这个特定文件夹中的一些 .m 文件,当我尝试打开它们时结果是:Does not exist
,显然是这样,因为我单击它并可以使用 run
使用它的功能...附加:Windows 7. 最近更新的许可证。
请让我知道您可以使用哪些信息来提供帮助。要么创建一个可以工作的新文件,要么修复当前文件的问题。谢谢。
编辑
我的命令中的示例输出 window - 看似不可理解...
m1=matfile(fullfile(projPath,'NexusMarkersProcessed.mat'),'Writable',false)
m1 =
matlab.io.MatFile
Properties:
Properties.Source: '\bontempi.medicine.utorad.utoronto.ca\home\PT\zabjeklab3\My
Documents\Data\Active Projects\JC_Hip\FL1502\FL1502\Patient
Classification 2\NexusMarkersProcessed.mat'
Properties.Writable: false
Methods
K>> m1.Properties.Source
ans =
\bontempi.medicine.utorad.utoronto.ca\home\PT\zabjeklab3\My
Documents\Data\Active Projects\JC_Hip\FL1502\FL1502\Patient
Classification 2\NexusMarkersProcessed.mat
K>> java.io.File(m1.Properties.Source).exists()
ans =
logical
0
暂停粘贴此window...返回:
java.io.File(m1.Properties.Source).exists()
ans =
logical
1
K>> who(m1)
Your variables are:
Patient10 Patient5 Patient9 Patient11 Patient6 Patient3
Patient7
K>> who(m1) K>> who(m1) K>>
java.io.File(m1.Properties.Source).exists()
ans =
logical
0
K>>
所以它有时会找到文件,并且可以读入它。有时它不能 - 这是因为它在 网络驱动器 上吗?
感谢任何帮助。
此问题是由访问网络驱动器上的文件引起的。一种解决方法是将文件复制到本地驱动器(使用C:
),然后使用matfile
,根据需要使用结果,然后替换网络驱动器文件,并删除本地文件,以return 东西恢复原状。一些研究让我意识到,如果网络上有任何文件,即使是 .m
个文件,事情也比他们需要的要慢。这是一个有效的函数:
function [m,noData]=safeMatFile(FilePath,safeFilePath)
%FilePath: absolute path to where the file is on the network
%safeFilePath: absolute path to where the file will be temporarily copied locally, C://
%safeDir='C:\Data';
%safeFold='tempFolder12345679';
%[~,tempDir,~]=mkdir(safeDir,safeFold);
%safeFilePath=fullfile(safeDir,safeFold,FileName);
noData=0;
dirFile=dir(FilePath);
if (length(dirFile) == 1) && ~(dirFile.isdir)%OR java below OR exist(forceFilePath,'file')==2
%if there is a file, make a temp folder on the C drive
if ~(java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile()) %ensure file doesn't exist, check dir too: || isempty(tempFolder)
copyfile(FilePath, safeFilePath);%moves existing file to backup folder
else
warning('SKIPPING (%s) - an old file of the same name was there, delete it!\n',safeFilePath);
return
end
%Load the temp local file into matlab
m=matfile(safeFilePath,'Writable',true);
else
m=[];
noData=1;
end
end
然后用 m
...做一些事情,最后:
function overwriteOldFiles()
if (java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile())
java.io.File(FilePath).delete();
java.io.File(safeFilePath).renameTo(java.io.File(FilePath));
end
end
和
function deleteTempFiles()
if (java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile())
java.io.File(safeFilePath).delete();
end
end
... 然后 rmdir
如有必要。
注意,我尝试了不同的方法来检查文件是否存在(我认为第一种是最快和最可靠的):
dirFile=dir(FilePath); if (length(dirFile) == 1) && ~(dirFile.isdir)
if (java.io.File(FilePath).exists() && java.io.File(FilePath).isFile())
if exist(FilePath,'file')==2
背景
我在 Matlab 2016b 中遇到函数 "matfile" 的一些奇怪行为 - 不确定发生了什么,我无法复制它或创建测试用例。
我有一个结构,我将其保存到服务器,如下所示:
PathToFile='ServerPath\My Documents\MyProj\testMatF.mat';
save(PathToFile,'-struct','myStruct'); %I tried the -v7.3 flag
问题
然后我读入:
m1=matfile(PathToFile);
在其他非常相似的结构上,我可以这样做:
myFields=fieldnames(m1);
但是对于这个文件我不能,我得到的只是自动 "Properties" 字段。
我试过的
myFields=who(m1)
- 给我字段名列表......有时。我不太了解who
的功能,但似乎,如果我穿插who m1
然后myFields=who(m1)
就可以了。显式键入
m1.TheFieldName
,有效。将文件移动到 comp 上的某个位置,如
C:\Data\
。然后使用fieldnames
工作。使用
load
,有效。
是否与服务器访问、损坏的文件、matfile 属性有关?另一件奇怪的事情是我在这个特定文件夹中的一些 .m 文件,当我尝试打开它们时结果是:Does not exist
,显然是这样,因为我单击它并可以使用 run
使用它的功能...附加:Windows 7. 最近更新的许可证。
请让我知道您可以使用哪些信息来提供帮助。要么创建一个可以工作的新文件,要么修复当前文件的问题。谢谢。
编辑
我的命令中的示例输出 window - 看似不可理解...
m1=matfile(fullfile(projPath,'NexusMarkersProcessed.mat'),'Writable',false)
m1 =
matlab.io.MatFile
Properties: Properties.Source: '\bontempi.medicine.utorad.utoronto.ca\home\PT\zabjeklab3\My Documents\Data\Active Projects\JC_Hip\FL1502\FL1502\Patient Classification 2\NexusMarkersProcessed.mat' Properties.Writable: false
Methods
K>> m1.Properties.Source
ans =
\bontempi.medicine.utorad.utoronto.ca\home\PT\zabjeklab3\My Documents\Data\Active Projects\JC_Hip\FL1502\FL1502\Patient Classification 2\NexusMarkersProcessed.mat
K>> java.io.File(m1.Properties.Source).exists()
ans =
logical
0
暂停粘贴此window...返回:
java.io.File(m1.Properties.Source).exists()
ans =
logical
1
K>> who(m1)
Your variables are:
Patient10 Patient5 Patient9 Patient11 Patient6 Patient3
Patient7K>> who(m1) K>> who(m1) K>> java.io.File(m1.Properties.Source).exists()
ans =
logical
0
K>>
所以它有时会找到文件,并且可以读入它。有时它不能 - 这是因为它在 网络驱动器 上吗?
感谢任何帮助。
此问题是由访问网络驱动器上的文件引起的。一种解决方法是将文件复制到本地驱动器(使用C:
),然后使用matfile
,根据需要使用结果,然后替换网络驱动器文件,并删除本地文件,以return 东西恢复原状。一些研究让我意识到,如果网络上有任何文件,即使是 .m
个文件,事情也比他们需要的要慢。这是一个有效的函数:
function [m,noData]=safeMatFile(FilePath,safeFilePath)
%FilePath: absolute path to where the file is on the network
%safeFilePath: absolute path to where the file will be temporarily copied locally, C://
%safeDir='C:\Data';
%safeFold='tempFolder12345679';
%[~,tempDir,~]=mkdir(safeDir,safeFold);
%safeFilePath=fullfile(safeDir,safeFold,FileName);
noData=0;
dirFile=dir(FilePath);
if (length(dirFile) == 1) && ~(dirFile.isdir)%OR java below OR exist(forceFilePath,'file')==2
%if there is a file, make a temp folder on the C drive
if ~(java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile()) %ensure file doesn't exist, check dir too: || isempty(tempFolder)
copyfile(FilePath, safeFilePath);%moves existing file to backup folder
else
warning('SKIPPING (%s) - an old file of the same name was there, delete it!\n',safeFilePath);
return
end
%Load the temp local file into matlab
m=matfile(safeFilePath,'Writable',true);
else
m=[];
noData=1;
end
end
然后用 m
...做一些事情,最后:
function overwriteOldFiles()
if (java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile())
java.io.File(FilePath).delete();
java.io.File(safeFilePath).renameTo(java.io.File(FilePath));
end
end
和
function deleteTempFiles()
if (java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile())
java.io.File(safeFilePath).delete();
end
end
... 然后 rmdir
如有必要。
注意,我尝试了不同的方法来检查文件是否存在(我认为第一种是最快和最可靠的):
dirFile=dir(FilePath); if (length(dirFile) == 1) && ~(dirFile.isdir)
if (java.io.File(FilePath).exists() && java.io.File(FilePath).isFile())
if exist(FilePath,'file')==2