Matfile没有加载结构的字段名称

时间:2017-02-07 19:45:41

标签: matlab file-io mat-file

背景

我在函数" matfile"中遇到了一些奇怪的行为。在Matlab 2016b中 - 不确定发生了什么,我无法复制或创建测试用例。

我有一个结构,我将其保存到服务器中,如下所示:

PathToFile='ServerPath\My Documents\MyProj\testMatF.mat';
save(PathToFile,'-struct','myStruct'); %I tried the -v7.3 flag

问题

然后我用以下内容阅读:

m1=matfile(PathToFile);

在其他非常相似的结构上,我可以这样做:

myFields=fieldnames(m1);

但对于这个文件我不能,我得到的只是汽车"属性"字段。

我尝试了什么

  1. myFields=who(m1) - 给我一些字段名称...有时候。我不太了解who函数,但似乎如果我穿插who m1,那么myFields=who(m1)就可以了。

  2. 明确输入m1.TheFieldName,有效。

  3. 将文件移动到comp上的某个位置,例如C:\Data\。然后使用fieldnames工作。

  4. 使用load,有效。

  5. 是否与服务器访问,损坏的文件,matfile属性有关?另一个奇怪的事情是我在这个特定文件夹中的一些.m文件,当我尝试打开它们时导致:Does not exist,当它显然时,因为我点击它并可以使用run功能...附加:Windows 7.最近更新的许可证。

    请告诉我您可以使用哪些信息来提供帮助。要么创建一个可以工作的新文件,要么修复当前文件的问题。感谢。

    修改

    命令窗口中的示例输出 - 看似难以理解......

      

    M1 = matfile(完整文件(projPath,' NexusMarkersProcessed.mat'),'可写',假)

         

    m1 =

         

    matlab.io.MatFile

         

    属性:         Properties.Source:' \ bontempi.medicine.utorad.utoronto.ca \ home \ PT \ zabjeklab3 \ My   Documents \ Data \ Active Projects \ JC_Hip \ FL1502 \ FL1502 \ Patient   分类2 \ NexusMarkersProcessed.mat'       Properties.Writable:false

         

    方法

         

    K>> m1.Properties.Source

         

    ans =

         

    \ bontempi.medicine.utorad.utoronto.ca \家\ PT \ zabjeklab3 \我的   Documents \ Data \ Active Projects \ JC_Hip \ FL1502 \ FL1502 \ Patient   分类2 \ NexusMarkersProcessed.mat

         

    K>>的java.io.File(m1.Properties.Source).exists()

         

    ans =

         

    逻辑

         

    0

    暂停在此窗口中粘贴...返回:

      

    的java.io.File(m1.Properties.Source).exists()

         

    ans =

         

    逻辑

         

    1

         

    K>>谁(M1)

         

    您的变量是:

         

    患者10患者5患者9患者11患者6患者3   患者7

         

    K>>谁(m1)K>>谁(m1)K>>   的java.io.File(m1.Properties.Source).exists()

         

    ans =

         

    逻辑

         

    0

         

    K>>

    因此它有时会找到该文件,并且可以将其读入.Othertimes它不能 - 这与它在网络驱动器上的事实有关吗?

    感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

此问题是由访问网络驱动器上的文件引起的。一种解决方法是将文件复制到本地驱动器(使用C:),然后使用matfile,根据需要使用结果,然后替换网络驱动器文件,并删除本地文件,把东西归还原状。一些研究让我意识到,如果任何文件,甚至.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