【问题标题】:Iterate through a lot of Structs遍历很多结构
【发布时间】:2014-11-14 01:19:51
【问题描述】:

我的问题如下:

我有大约 300 个结构文件。 它们是这样设置的:

DSC_0001 中有大约 250 个其他结构文件: -> 像这样:DSC_0001.marker_1 这个有10个数字。 像那样: DSC_0001.marker_1.flow_angle = 90

现在我想遍历所有 Struct 文件 类似的东西:

for i = 1:300
    for j = 1:250
         flow_angle = DSC_**i**.marker_**j**
    end
end

有没有办法做到这一点? 我有一种感觉,这可能真的很容易,但我就是找不到解决方案...... 我希望我的问题足够清楚......

感谢您的帮助!

【问题讨论】:

    标签: matlab loops struct


    【解决方案1】:

    我猜这是一个可怕的 eval 函数的用例:

    for i = 1:300
        for j = 1:250
             eval (['flow_angle = DSC_', sprintf('%04d',i), '.marker_', num2str(j)]);
        end
    end
    

    但是NB上面的代码有两个问题

    1. 您还没有告诉我们要将角度存储在哪里,所以我的代码没有:/ 但如果您只想将它​​们存储在矩阵中,您会想要这样的东西:eval (['flow_angle(', num2str(i), ',', num2str(j), ') = DSC_', sprintf('%04d',i), '.marker_', num2str(j)])
    2. eval 是一种可怕的做事方式,但你不得不这样做,因为有人将你的数据保存在一个可怕的地方。通过以更智能的方式重新保存您的数据,现在就为未来整理好自己!比如:

    .

    for i = 1:300
         eval ( ['DSC(', num2str(i), ') = DSC_', sprintf('%04d',i)]);
    end
    %// then save DCS!
    

    现在您可以遍历这个结构矩阵,而不是让 300 个结构污染您的工作空间并强迫您使用eval

    【讨论】:

    • 非常感谢!!评估正在工作!我想将它们存储在矩阵 flow_angle(i,j) 中......为什么 eval 这么可怕?是不是很慢?
    • @Bant 与它一起工作和调试是一项艰巨的任务。非常难以读写代码等。我真的建议您将数据保存为更好的格式,以便将来避免 eval
    • @Bant 另外请阅读 ioums 的回答,这是一个更好的选择
    • 我有两种格式的数据。 Mat 文件和 txt 文件!因此,我认为 mat 文件可能更好用。但在这种情况下,我可能只是切换到 txt 文件
    【解决方案2】:

    如果可能,不要使用 eval。

    这取决于您的数据的存储方式,但一种可能性是它位于 .mat 文件中。在这种情况下,它可以使用

    加载
    DSC_structs = load('My_DSC_struct_file.mat');
    

    然后你可以像这样访问这些值:

    for i = 1:300
        for j = 1:250
            flow_angle(i,j) = DSC_structs.(['DSC_' sprintf('%04d',i)]).(['marker_' sprintf('%d',j)]);
        end
    end
    

    Why avoid the eval function

    编辑:您说每个结构都在不同的文件中。这有点混乱。我可能会做这样的事情来加载它们:

    DSC_structs = cell(1,300);
    for i = 1:300
        %Note: I'm guess at your file names here
        DSC_structs{i} = load(['DSC_' sprintf('%04d',i) '.mat'];
    end
    

    然后访问值作为

    DSC_structs{i}.(['DSC_' sprintf('%04d',i)]).(['marker_' sprintf('%d',j)]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多