0

У меня есть трехмерная матрица с именем Spr размера 5x5x500. Последнее измерение представляет индивидуумов, а первые два измерения относятся к состояниям. Следовательно, для каждого человека я сохраняю матрицу вероятностей перехода 5х5 из состояния i в состояние j. Например, вероятность перехода последнего индивида является:Matlab: индексирование многомерного массива с матрицей

Spr(: , : , 500) 

ANS =

0.1386 0.3768 0.2286 0.1871 0.0688 
0.1456 0.3959 0.2401 0.1966 0.0218 
0.1475 0.4011 0.2433 0.1992 0.0090 
0.1486 0.4039 0.2450 0.2006 0.0020 
    0 1.0000   0   0   0 

Я хотел бы получить доступ к трехмерный матрице SPR с первым индексом, предоставляемым в 500x1 матрице S, которая хранит в в котором указывается конкретный индивидуум. Следовательно, моим окончательным результатом будет матрица 1x5x500. Например, если пятисотый индивидуум в настоящее время в состоянии S (I) = 2 соответствующая строка для этого человек будет соответствовать:

Spr(S(i),:,i) 

0.1456 0.3959 0.2401 0.1966 0.0218 

Как я могу сделать это без использования петли?

Я попытался с помощью sub2ind функции в Matlab , но она не работает, как это требует, чтобы все индексы целые и по существу мой второй индекс характер «:».

ответ

1

Просто для FULLFILL «нет петли» требование:

N=sum(bsxfun(@times,permute(full(sparse(S,1:numel(S),1)),[1,3,2]),Spr),1) 

Хитрость заключается в том, чтобы создать матрицу индексации, которая выбирает нужный контент с помощью times. Это решение хорошо, но мне не нравится, потому что это медленнее и менее эффективно, чем память этого гораздо более простое решение, используя для цикла:

N=nan(1,size(Spr,2),size(Spr,3)) 
for k=1:size(Spr,1) 
    N(1,:,S==k)=Spr(k,:,S==k) 
end 
+0

Действительно, цикл кажется намного проще. Мне нужно встроить эту операцию в другую для цикла, и я боялся, что это займет много времени, имея вложенные циклы. Спасибо! – Georgia2004

Смежные вопросы