Поскольку вы выполняете только элементарные операции, такие как -
и .*
, это требует решения с использованием bsxfun
.
Использование
bsxfun(@minus,P,S)
сделать поэлементное вычитание P(k,1) - S(1,i)
. Результатом будет матрица [2000,400]
. Вы можете применить max(0,...)
операцию на этой матрице, и, наконец, использовать bsxfun
снова мультипликативный каждую строку, соответствующую r
:
bsxfun(@times,max(bsxfun(@minus,P,S),0),r)
Как ваш c
должен быть размером [400,2000]
, добавить последнюю операцию транспонирования, и вы законченный.
c = bsxfun(@times,max(bsxfun(@minus,P,S),0),r).';
Небольшое сравнение времени: для цикла принимает
Elapsed time is 0.688408 seconds.
в то время как bsxfun
решения принимает только
Elapsed time is 0.007884 seconds.
который является хорошим ускорением из 87 для точно такие же результаты.
Работает безупречно. Большое спасибо. – phdstudent