【问题标题】:Evaluate variables in external file strings评估外部文件字符串中的变量
【发布时间】:2013-06-24 01:59:21
【问题描述】:

问题

我想导入一个包含数字和变量/符号混合数据类型的 CSV 文件。导入部分已经在Import CSV file with mixed data types 中讨论过。

说明

此处的 CSV 文件仅包含 2x2 公式(但通常为 64x64,我对其进行了 1'000'000 次评估)。 我面临的问题是细胞的评估。这不能以同样的方式完成。

matlab 代码类似于

% Parameter initialization
vector1 = ones(1e6);
a=1;
b=2;
c=3;
d=4;

% Formula calculation
vector2(1)=import('input000001.csv');

我的最小输入文件input000001.csv 包含一些公式,例如:

a*vector1(1),2*vector1(1)/b
c+vector1(1),3*vector1(1)^d

【问题讨论】:

    标签: matlab types import evaluation


    【解决方案1】:

    试试这个

    [a b c d] = deal(1,2,3,4);
    
    data = strcat(importdata('input.csv', sprintf('\n')), ';');
    Matrix = eval(['[' data{:} '[]]']);
    

    编辑:为避免eval 减速,您可以将字符串写入另一个 m 文件并在循环中调用它。像这样的:

    [a b c d] = deal(1,2,3,4);
    
    matDef = regexprep(fileread('input.csv'), {'(\r\n|\r|\n)' ';^'}, {';' ''});
    f = fopen('inputMatrix.m', 'w');
    fwrite(f, ['Matrix = [' matDef '];'])
    fclose(f);
    rehash
    
    for k=1:100000,
        inputMatrix
    end
    

    您需要 rehash 要求 matlab 将新创建的 inputMatrix 添加到已知函数列表中。

    【讨论】:

    • @strpeter 很高兴它成功了。然后你可以选择它作为答案。
    • 尽管如此,例程的运行速度不如从 input.csv... 复制粘贴数据快... 有没有办法优化它?
    • 您的文件有多大?每条线路运行需要多长时间?我怀疑eval 比导入需要更长的时间。在这种情况下,没有什么可做的,因为即使在复制粘贴之后,当您运行代码时,您也必须花费大量时间让 Matlab 评估矩阵。
    • 我的文件只有 16x16(泛化为 64x64),但我评估了 1'000'000 次。导入后,您仍然必须将 eval 应用于我可以通过复制粘贴来避免的字符串。结果:代码变慢了 24 倍以上!
    • @strpeter 添加了一个替代解决方案以避免eval
    【解决方案2】:

    经过一些提示后,我实现了以下解决方案。

    %% Initialization
    a=1;
    b=2;
    c=3;
    d=4;
    
    %% Procedure for input and evaluation
    Temp = cell(read_mixed_csv('input.csv',','));
    [imax,jmax]=size(Temp);
    Matrix = zeros(imax,jmax);
    for i = (1:imax)
        for j = (1:jmax)
            Matrix(i,j) = eval(Temp{i,j});
        end
    end
    

    其中read_mixed_csv('input.csv',',') 来自Import CSV file with mixed data types

    我愿意寻求更好的答案!

    【讨论】:

    • 我很想知道为什么您将代码行保存到 .csv 中,或者您无法控制 .csv 的生成?
    • 我自己生成了 .csv 文件:它是从 Mathematica 导出的 Table,是一些分析处理的结果。由于我现在想对矩阵进行更高效的计算,所以我想将矩阵交给 MATLAB。
    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2016-08-28
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多