MATLAB每次迭代更改矩阵的名称

时间:2013-03-15 17:20:07

标签: matlab matrix iteration

我只是想知道在每次迭代后用不同的名称存储矩阵是否干净?我希望能够以不同的名称存储每个矩阵(uMatrix),具体取决于我在哪个模拟,例如Sim1,Sim2,......等。首先运行Sim1 = uMatrix,然后Sim2 = uMatrix第二次跑。因此,每次我可以为每个不同的模拟存储不同的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

3 个答案:

答案 0 :(得分:6)

确实有太多选择。要描述将数据放入并获取一些这些方法的数据:

以变量名称编码

我真的非常不喜欢这种方法,但它似乎是你特别要求的。要将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传递给函数以进行进一步处理。

使用地图

要使用地图执行相同的存储,请先初始化地图

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}

答案 1 :(得分:3)

为了补充@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

答案 2 :(得分:0)

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