Как сделать этот код проще для ускорения работы - PullRequest
0 голосов
/ 08 января 2019

У меня матрица 2800х4800. Данные есть только в первом столбце. Я хочу добавить данные остальных колонок, а также. Значения в строке должны продолжаться следующим образом: n = (n-1) + 0,005. Я написал код с циклом, и он работает, однако это занимает слишком много времени. Как я могу написать это без цикла?

for j=2:size(Time,2)
    Time(:,j) = Time(:,(j-1)) + (1/(Fs*1000));
end

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Можно получить те же результаты, что и ваш пример кода, в одну строку, написав

Time(:,2:end) = bsxfun(@plus,Time(:,1), (1/(Fs*1000)) .* (1:size(Time,2)-1));

Если у вас более новая версия Matlab (> = r2016b), вы можете использовать неявное расширение Matlab и просто написать

Time(:,2:end) = Time(:,1) + (1/(Fs*1000)) .* (1:size(Time,2)-1);

Но, по крайней мере, на моем компьютере я не вижу никакого улучшения производительности, используя эту векторизацию вместо вашего цикла. Компиляция JIT со временем стала немного лучше, поэтому было бы интересно узнать, какую версию Matlab вы используете.

0 голосов
/ 08 января 2019

Это может быть похоже на следующее, заменив вычисление для строк 1:2:size(Time,2)-1 на строки 2:2:size(Time,2) (действительно, вы можете удалить for для ускорения). Обратите внимание, мы предполагаем, что Fs является константой здесь:

m = size(Time,2);
Time(:,2:m)= Time(:,1:(m-1))+(1/(Fs*1000));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...