2

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

3 回答 3

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给函数以进行进一步处理。

使用地图

要用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}
于 2013-03-15T17:53:12.903 回答
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]

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

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
于 2013-03-15T18:24:05.693 回答
0

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

于 2013-03-15T17:24:10.890 回答