Можно ли векторизовать извлечение данных из массива ячеек в MATLAB? - PullRequest
0 голосов
/ 05 июля 2019

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