У меня есть матрица вероятности (glcm) размером 256x256x20. Я изменил матрицу на 65536x20, так что я могу исключить один цикл (по третьему измерению).Matlab Vectorize
Я хочу сделать следующий расчет.
for y = 1:256
for x = 1:256
if (ismember((x + y),(2:2*256)))
p_xplusy((x+y),:) = p_xplusy((x+y),:) + glcm(((y-1)*256+x),:);
end
end
end
Так p_xplusy будет 511x20 матрица, каждый элемент является суммой диагонали матрицы NxN к югу (где п принадлежит 1: 256) исходной матрицы 256x256x20.
Этот код блокирует мою программу неэффективно, и я хочу векторизовать этот цикл. Любая помощь будет оценена по достоинству.
'ismember' - довольно дорогой вызов функции. Просто взглянув на это, похоже, что вы можете заменить строку 'if (ismember ((x + y), (2: 2 * 256)))' с помощью 'if x + y <= 2 * 256 && x + y> 1 '. То, что я предлагаю, не векторизует, но может ускорить этот код до LOT. – chessofnerd
Векторизация не обязательно быстрее в Matlab. При компиляции JIT для циклов часто бывают такие же быстрые, как и векторизованные методы, и часто лучше масштабируются при меньшем использовании памяти. Разумеется, это предполагает, что ваш цикл цикла написан разумно, а @chessofnerd уже обеспечил улучшение. – David
Вы сказали: «p_xplusy будет 511x20», но он бросил мне ошибку с учетом значений «rand». Мне пришлось сделать это «rand (512,20)», чтобы заставить его работать. Не могли бы вы прояснить это? – Divakar