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

标签 matlab matrix iteration

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

最佳答案

选择实在是太多了。描述将数据放入和获取数据的几种方法:

在变量名中编码

我真的非常不喜欢这种方法,但这似乎是您特别要求的。要将 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做同样的存储,首先要初始化map

simResults = containers.Map('keyType','char','valueType','any');

然后在每次迭代时将值添加到 map

simResults(Sim) = uMatrix;

访问数据

listOfStoredDataNames = simResults.keys
someStoredDataItem = simResults(listOfStoredDataNames{1})
%or of you know the name already
someStoredDataItem = simResults('Sim1')

map 在可用于名称的字符串中更灵活一些,如果您愿意的话,这可能是更好的解决方案。

使用元胞数组

为了简单,没有废话的结果存储

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}

关于MATLAB 每次迭代更改矩阵的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438464/

相关文章:

c++ - OpenCV 读取图像并使用整数值管理它们的像素(如 matlab)

r - 矩阵的每一行与另一个矩阵的相应行的叉积

python:如何从矩阵中有效地去除行,其中元素出现在其他行中

matlab - 查找一组值在矩阵中的位置

javascript - 我正在寻找检查树是否对称的迭代解决方案

c++ - 如何从Matlab调用具有多个输出的C++函数?

xml - 当 matlab 中的 XML 文件内存在一些特殊的 UTF-8 字符时如何处理

Matlab XTickLabels 警告

java - 将(BST 的)迭代层序遍历转换为递归实现

python - 为什么迭代 dict 这么慢?