2

異なる名前で各反復の後に行列を格納するクリーンな方法があるかどうか疑問に思っていましたか?Sim1、Sim2など、どのシミュレーションを実行しているかに応じて、各マトリックス(uMatrix)を異なる名前で保存できるようにしたいと思います。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(5回目の実行後に)変数として保存する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}

または、わずかなレベルのナンセンスを使用する

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によって与えられた詳細な回答に追加するために、私が好きなもう1つの方法があります。

構造体の配列を使用する

配列の各項目は、結果と追加情報を格納する構造です。

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配列内の各要素のプロセスにtoを使用することもできます。

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 に答える