【问题标题】:MATLAB Changing the name of a matrix with each iterationMATLAB 每次迭代更改矩阵的名称
【发布时间】:2013-03-04 12:36:14
【问题描述】:

我只是想知道是否有一种干净的方法可以在每次迭代后以不同的名称存储矩阵?我希望能够将每个矩阵(uMatrix)存储在不同的名称下,具体取决于我在哪个模拟上,例如 Sim1、Sim2、.... 等。所以 Sim1 = uMatrix 在第一次运行之后,然后 Sim2 = uMatrix 之后2次贯穿。这样每次我都可以为每个不同的模拟存储不同的 uMatrix。

任何帮助将不胜感激,如果这是一个愚蠢的问题,我们深表歉意。此外,有关是否可以清理此代码的任何指针也会很棒

我在下面使用的代码

d = 2;            
kij = [1,1];
uMatrix = [];
RLABEL=[];
SimNum = 2;

for i =1:SimNum
    Sim = ['Sim',num2str(i)] %Simulation number
    for j=1:d
        RLABEL = [RLABEL 'Row','',num2str(j) ' '];
        Px = rand;
        var = (5/12)*d*sum(kij);
        invLam = sqrt(var);
        u(j) = ((log(1-Px))*-invLam)+kij(1,j);
        uMatrix(j,1) = j;
        uMatrix(j,2) = u(j);
        uMatrix(j,3) = kij(1,j);
        uMatrix(j,4) = Px;
        uMatrix(j,5) = invLam;
        uMatrix(j,6) = var;
    end
    printmat(uMatrix,'Results',RLABEL,'SECTION u kij P(Tij<u) 1/Lambda Var')
end

【问题讨论】:

    标签: matlab matrix iteration


    【解决方案1】:

    确实有太多的选择。描述一下将数据放入和获取数据的几种方法:

    在变量名中编码

    我真的非常不喜欢这种方法,但这似乎是您特别要求的。要将 uMatrix 保存为变量 Sim5(在第 5 次运行之后),请将以下内容添加到循环末尾的代码中:

    eval([Sim ' = uMatrix;']);  %Where the variable "Sim" contains a string like 'Sim5'
    

    访问数据

    listOfStoredDataNames = who('Sim*')
    someStoredDataItem = eval(listOfStoredDataNames {1})  %Ugghh
    %or of you know the name already
    someStoredDataItem = Sim1;
    

    现在,请不要这样做。让我试着说服你有更好的方法。

    使用结构

    为了做同样的事情,使用一个名为(例如)simResults的结构

    simResults.(Sim) = uMatrix;
    

    甚至更好

    simResults.(genvarname(Sim)) = uMatrix;
    

    访问数据

    listOfStoredDataNames = fieldnames(simResults)
    someStoredDataItem = simResults.(listOfStoredDataNames{1})
    %or of you know the name already
    someStoredDataItem = simResults.Sim1
    

    这避免了总是有问题的eval 语句,更重要的是使附加代码更容易编写。例如,您可以轻松地将所有 simResults 传递到函数中以进行进一步处理。

    使用地图

    要使用map做同样的存储,先初始化map

    simResults = containers.Map('keyType','char','valueType','any');
    

    然后在每次迭代中将值添加到地图中

    simResults(Sim) = uMatrix;
    

    访问数据

    listOfStoredDataNames = simResults.keys
    someStoredDataItem = simResults(listOfStoredDataNames{1})
    %or of you know the name already
    someStoredDataItem = simResults('Sim1')
    

    地图在可用于名称的字符串中更灵活一些,如果您觉得舒服,可能是更好的解决方案。

    使用元胞数组

    为了简单,没有废话的结果存储

    simResults{i} = uMatrix;
    

    访问数据

    listOfStoredDataNames = {};  %Names are Not available using this method
    someStoredDataItem = simResults{1}
    

    或者,使用轻微的废话

    simResults{i,1} = Sim;      %Store the name in column 1
    simResults{i,2} = uMatrix;  %Store the result in column 2
    

    访问数据

    listOfStoredDataNames = simResults(:,1)
    someStoredDataItem = simResults{1,2}
    

    【讨论】:

    • 在写这篇文章的时候,感觉很熟悉。另请参阅:stackoverflow.com/a/14130366/931379 进行类似讨论。
    • 感谢您的 cmets。我有兴趣听取您的建议,而不是使用 EVAL 功能。我发现使用 Strucutre 的唯一问题是 MATLAB 只返回 Sim1: [2x6 double] Sim2: [2x6 double] ,如果我想回去查看矩阵的用途,现在有没有办法访问这些数据是 Sim1 还是 Sim2?
    • 当然。我将在几分钟后将每种方法的访问方法放在适当的位置。现在,试试:simResults.Sim1;或temp = simResults.Sim1;甚至是names = fieldNames(simResults),然后是simResults.(names{1})
    • 非常感谢您的帮助。我使用结构来存储结果(我无法让地图工作,但我认为这只是因为我还没有完全理解它)然后使用你给我的访问帮助来提取数据如果我想要审查它。我还尝试了@Bill Cheathams 的方法,效果也很好。我只是想知道一种方法是否比另一种更好?
    【解决方案2】:

    只是为了补充@Pursuit给出的详细答案,我喜欢另一种方法:

    使用结构数组

    数组中的每一项都是一个存储结果和任何附加信息的结构:

    simResults(i).name = Sim;         % store the name of the run
    simResults(i).uMatrix = uMatrix;  % store the results 
    simResults(i).time = toc;         % store the time taken to do this run
    

    等等。数组中的每个元素都需要具有相同的字段。您可以使用快速操作从数组中提取所有元素,例如一目了然地查看每次运行的时间:

    [simResults.time]
    

    您还可以使用arrayfun 对数组中的每个元素进行处理:

    anon_evaluation_func = @(x)( evaluate_uMatrix( x.uMatrix ) );
    results = arrayfun( anon_evaluation_func, simResults );
    

    或更简单的语法,

    for i = 1:length(simResults)
        simResults(i).result = evaluate_uMatrix( simResults(i).uMatrix );
    end
    

    【讨论】:

    • 我有时也用这种方法。
    • 感谢您的帮助。这种方法也很有效。正如我在回复@Pursuit 时所说的那样,我只是想知道使用结构数组而不是仅仅创建一个结构是否有优势?
    • 这个方法(结构数组):更容易迭代(不需要先获取字段名),可以支持任何名称(包括例如空格),可以支持额外的数据字段(例如“时间” ,如本例所示。如果您的编码技能足够,这比具有命名字段的简单结构要好。
    【解决方案3】:

    我会尝试使用存储&lt;name, matrix&gt; 的地图。 可能的方法是使用http://www.mathworks.com/help/matlab/map-containers.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多