我只是想知道在每次迭代后用不同的名称存储矩阵是否干净?我希望能够以不同的名称存储每个矩阵(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
答案 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