【问题标题】:Struct Array Generation Loop Matlab结构数组生成循环 Matlab
【发布时间】:2015-10-21 03:30:34
【问题描述】:

假设我有一个目录列表:

/users/david/patients/patientID/Day
/users/david/patients/patientID/Daya/HospID_x/Data
/users/david/patients/patientID/Dayb/HospID_y/Data
/users/david/patients/patientID/Dayc/HospID_z/Data
/users/david/patients/patientID/Day
/users/david/patients/patientID/Daya/HospID_x/Data
/users/david/patients/patientID/Dayb/HospID_y/Data
/users/david/patients/patientID/Dayc/HospID_z/Data
/users/david/patients/patientID/Day
.
.

数据是混合的,包含图像、矢量、文本等。我已经生成了一个文件夹列表,其中包含我要对其执行操作的数据。在我的脚本中处理这些数据类型之后,我在工作区中生成了一堆变量。变量在下一个循环中被覆盖。我想创建一个包含这些变量或结果的结构文件。这意味着,患者将在患者 ID 下拥有多个 DaysID,在 DaysID 下拥有不同的 HospID。

【问题讨论】:

  • 您觉得可以创建一个树结构来更好地解释这一点吗?我很难找到哪些字段是值,哪些是标题。
  • 这是树形结构:imgur.com/OEHqfT6,谢谢。让我难过的是结构中的字段被访问过一次,以及在字段中创建的值。
  • 你对嵌套结构数组而不是单元格有什么看法?此外,这里的性能是一个问题吗?如果性能是一个问题,您应该使用嵌套的 for 循环或 while 循环。由于结构是固定的(嵌套 for 循环的部门是确定性的),这很容易。让第一个循环为Patient 并深入每个循环。字段的名称可以用这种方式设置,t='DayA'; q.(t) = 'foo';。尝试这个。当我不确切知道您的变量是什么样子时,很难提供代码。对于嵌套结构数组,我的意思是包含其他结构或结构数组的结构数组
  • 请找到上面的代码,文件夹列表如上即:
  • 好的,谢谢,我想我现在开始清楚地了解这个问题了。我了解您想从文件夹系统中命名结构。就多了一个问题。文件夹/users/david/patients/patientID/Day 是这些具有确切名称的空文件夹(可能除了唯一的患者 ID)?

标签: matlab if-statement for-loop data-structures struct


【解决方案1】:

好的,代码需要一些时间才能下来。此外,代码在某些地方有点硬编码,因此您可能需要清理一下。主要问题是我不知道您的Data 文件的确切格式。此外,代码不包括字段为空的情况超过字段 Day__ 的情况,因为这是您呈现数据的方式。这意味着您将不得不做一些事情来定制。

1) Rename the paths
2) Add if-statements for empty if needed
3) Edit the inner loop to work with your data.

代码应该足够清晰。我制作了一个基于 for 循环的代码,您当时可以在其中降级。我没有使用你的确切层次结构,但类似。如果这不起作用,请尝试评论并解释原因。代码,

function dummies = test()

basedir = 'C:\Users\username\Documents\MATLAB\dummies';
level1 = dir(basedir);
dummies=[];

for k = level1(3:end).'
    level2 = dir(fullfile(basedir, k.name));
    for l = level2(3:end).'
        level3 = dir(fullfile(basedir, k.name, l.name));
        if length(level3) < 3
            dummies.(k.name).(l.name) = [];
        else
            for m = level3(3:end).'
                level4 = dir(fullfile(basedir, k.name, l.name,m.name));
                for n = level4(3:end).'
                    dat = load(fullfile(basedir, k.name, l.name,m.name,n.name));
                    dummies.(k.name).(l.name).(m.name) = dat;
                end
            end
        end
    end
end 

也可以使用递归解决方案来实现这一点,但是 Matlab 在递归方面不太好,所以我在这个例子中避免了这个。

【讨论】:

  • 谢谢帕特里克!请让我试一试。
  • 我不确定我是否理解您在这里所做的事情。我已经有一个文件列表。它是按顺序访问的,使用它的一个关键原因是避免文件位于任何位置的混乱,例如在 mac 平台或单独的服务器上,您拥有“.DS_Store”文件夹或 xml 文件等。我唯一需要数据的地方是位置文件夹。我现在只是干运行以返回一个结构文件,其中包含我可以填充的空字段。如果我不清楚,请告诉我。
  • @Rigusorio 我认为练习的整个想法是导入数据并将其存储在结构数组中。提供的代码将(进行一些修改以适合您的数据)为您提供一个填充数据的结构。但是,如果您想要一个空结构(我不知道您为什么想要一个几乎相同的成本),只需将我添加数据的字段留空(dummies.(k.name).(l.name).(m.name) = [])。如果您有其他需求,请编辑问题并更好地说明您的需求。
  • 谢谢!这个想法是转到一个文件夹(最后一级),其中数据是“做一堆东西”,将结果存储在一个字段中,但允许我们追溯结果的来源,即位置。
  • 谢谢!这个想法是转到一个文件夹(最后一级),其中数据是“做一堆东西”,将结果存储在字段中,但允许我们追溯结果的来源,即按位置。因此,我们在处理后有一个结构文件,如下所示: 'dummies.(k.name).(l.name).(m.name).datatypes' 我使用文件夹名称列表转到数据所在的位置,在离开文件夹或进入文件夹时做一些事情。我创建了保存结果的结构文件 - 这让我现在很难过。它是命名例程或为我找到我所追求的文件的位置构建地址。谢谢帕特里克!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多