Мне интересно, возможно ли использовать вектор для доступа к данным в массиве ячеек.Я надеюсь достичь этого, используя векторизованный подход, а не цикл 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