MATLAB更改矩阵的名称与每个迭代MATLAB更改矩阵的名称与每个迭代(MATLAB Changi

2019-05-12 09:40发布

我只是想知道是否有存储与不同的名称在每次迭代后的矩阵一个干净的方式? 我想能够将每个矩阵(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

Answer 1:

实际上有太多的选择。 去把两者数据描述到,并且得到一些这些方法对我们的数据:

编码在变量名

我真的,真的不喜欢这种方法,但它似乎是你所明确要求的。 为了节省uMatrix作为变量Sim5 (第五运行之后),添加以下代码在循环的结尾:

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}

或者,使用nonesense轻微水平

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}


Answer 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


Answer 3:

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



文章来源: MATLAB Changing the name of a matrix with each iteration