【问题标题】:Matlab - How to do this without dynamic variable / eval?Matlab - 如何在没有动态变量/评估的情况下做到这一点?
【发布时间】:2013-11-21 02:53:10
【问题描述】:

我的数据收集软件将数据输出为 .csv 文件,第一行是每个输出的标题,然后是包含数据的行(我认为这很标准)。可以在此处找到示例数据文件:Example data file

这是我遇到问题的第一点。基本上,当我导入文件时,我得到 2 个矩阵,一个包含标题(所以只有一个 [1xN] 矩阵,其中 N 是输出的数量。N 在实验之间发生变化,这是这里问题的一部分),另一个包含所有数字数据点。由此,我需要创建使用“标题”矩阵中的每个标题命名的数组。我实际上需要将它们从矩阵中拉出来,而不仅仅是拥有一组标准的名称,这些名称将与“数据”矩阵中的每一列相对应,因为输出的数量和可能的输出名称是可以(并且经常)在文件之间更改。

我知道这可以使用 eval 函数来完成,但我也知道应该尽可能避免使用 eval 函数。我只是不知道如何做到这一点。

下一个复杂级别,我认为解决方案(如果有的话)将类似于上面的解决方案,是我需要以嵌套结构的形式维护文件夹结构。这是因为我需要能够一次导入多个这些文件。

所以,举个例子,嵌套结构看起来像这样:

File Structure

典型的文件路径如下所示: H:\RawData\11-01-13\Cell1\ProximalDendrite_001\Sweep1.csv

等等,其中 Sweep1 对应于一个 VoltageOutputs 文件,就像我链接的那个文件一样(每个文件夹通常有多个扫描)。

然后的想法是为每个扫描创建一个包含各种 OutputVariable 数组的矩阵。每个数据文件夹有多个扫描,每个数据文件夹都包含在该数据集的更大文件夹中。我需要能够根据它们对应的文件名来命名将包含所有这些的矩阵。

我们的想法是最终拥有一些东西,我可以从特定的扫描中调用特定的数组。因此,使用上面的示例,我可以使用 Cell1 的 Dendrite001 调用 Outputs001 的“主要”输出:

11-01-13_Cell1.ProximalDenrite_001.Sweep1.Primary

因此,需要能够通过首先查看它们的命名方式(这很容易获得)来命名这些事物,保存该字符串,并以某种方式用相应的名称重命名矩阵。

这同样可以使用 eval 函数,但如果存在替代方案,我当然想走这条路。

【问题讨论】:

    标签: matlab csv dynamic matrix eval


    【解决方案1】:

    我做了类似的事情,我创建了一个结构,其中每个字段名称都来自文件中的标题信息。我的非常复杂,我现在无法访问该代码,但它基本上是这样的:

    % use the header field as the name and assign all rows to that vector
    for nidx = 1:length(headers)
       structname.(headers{nidx}) = data(:,nidx);
    end
    

    只要您的标题字段名称是有效的 Matlab 变量名称,它就相当简单,否则您需要翻译字符以首先从每个标题字符串中删除任何无效的字符。

    【讨论】:

    • 我知道你如何在第一关之后制作每个关卡。但是,您能想出一种方法来使用文件本身的名称来命名结构本身。因此,例如,我在示例中的结构名称是 11-01-13_Cell1 我的意思是,可能我只需要创建默认结构(例如 DataSet1),这可以作为一种解决方法,但显然不是理想。
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2019-01-18
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多