我想知道是否有可能使用向量访问单元阵列中的数据。我希望使用向量化方法而不是for循环来完成此操作。
我正在尝试在MATLAB中运行一个简单的微仿真。我有一个模拟队列,最初是健康的,但有些人患某种特定疾病的风险较低,而另一些人则较高。因此,我有一个数组(Starting_Cohort),该数组指示每个患者的风险级别(第一列)及其初始状态(第二列)。此外,我有一个细胞阵列(pstar),用于指示每个患者在两种假设的健康状态(即“健康”和“病残”)之间转换的可能性。
我要完成的工作如下: 1)在模拟的每个阶段(t = 1:T),请使用起始队列的第一列来确定患者的风险水平(即1或2)。 2)使用风险级别来访问单元格阵列的特定单元格(取决于其风险级别)中的特定行(取决于其当前的健康状况)。 3)将所得向量与均匀分布(包含在数组“ r”中)的随机抽取进行比较,并选择与大于该抽取的第一个值关联的列号(该列号确定了其在随后期间的健康状态) )。
但是,我想避免一次对一位患者进行此操作(即引入嵌套循环),因为这会将代码的执行时间增加了一个数量级(实际队列包括大约20000位患者) 。我一直在尝试通过向量化来实现这一目标-即同时在整个患者队列中运行模拟-但在尝试从上述细胞阵列访问数据时遇到了障碍。
Starting_Cohort = [1 1; 1 1; 2 1; 2 1;];
[Cohort_Size, ~] = size(Starting_Cohort);
pstar = cell(2, 1);
pstar{1, 1} = [0.75 1.00; 0.15 1.00]; pstar{2, 1} = [0.65 1.00; 0.25 1.00];
rng(1234, 'twister'); T = 5; r = rand(Cohort_Size, T);
Sim_Results = [Starting_Cohort zeros(Cohort_Size, T)];
for t = 1:T
[~, Sim_Results(:, t+2)] = max(pstar{Sim_Results(:, 1), 1} ...
(Sim_Results(:, t+1), :) > r(:, t), [], 2);
end
运行上面的代码时,出现错误“大括号或点索引表达式期望输出一个,但有4个结果。”我认为这意味着我从单元格数组中提取信息的方法是不合适的,尽管我不确定是否可以解决这个问题或如何解决。对于提供的任何帮助,我将深表感谢!
更新070619:我最终使用下面的代码使它开始工作。实际上,我创建了一个字符串数组,其中包含要应用于每行的表达式。除每行外,该表达式均相同,因为它包含行索引。然后,我可以使用arrayfun和evalin产生与我想要的结果相似的结果。不幸的是,我自己的问题涉及稀疏数组,因此我实际上无法解决最初的问题。但是,我希望这些信息可能仍然对其他人有用。
Starting_Cohort = [1 1; 1 1; 2 1; 2 1;];
[Cohort_Size, ~] = size(Starting_Cohort);
pstar = cell(2, 1);
pstar{1, 1} = [0.75 1.00; 0.15 1.00];
pstar{2, 1} = [0.65 1.00; 0.25 1.00];
rng(1234, 'twister'); T = 5; r = rand(Cohort_Size, T);
Sim_Results = [Starting_Cohort zeros(Cohort_Size, T)];
for i = 1:Cohort_Size
TEST(i, 1) = strcat("max(pstar{Sim_Results(", string(i), ", 1), 1}",...
"(Sim_Results(", string(i), ", t+1), :) > ", ...
"r(", string(i), ", t), [], 2)");
end
for t = 1:T
[~, Sim_Results(:, t+2)] = arrayfun(@(x) evalin('base', x), TEST);
end