MATLAB: заполнить массив числами в приращениях - PullRequest
2 голосов
/ 19 марта 2012

Я бы хотел, чтобы массив MATLAB заполнял столбец числами с шагом 0,001. Я работаю с массивами из 200 000 000 строк и поэтому хотел бы использовать наиболее эффективный из возможных методов. Я рассмотрел использование следующего кода:

for i = 1 : size(array,1)
    array(i,1) = i * 0.001;
end

Должен быть более эффективный способ сделать это ..?

Ответы [ 3 ]

9 голосов
/ 19 марта 2012

Хорошо, принятый ответ довольно близок к тому, чтобы быть быстрым, но недостаточно быстрым.Вы должны использовать:

s=size(array,1);
step=0.0001;
array(:,1)=[step:step:s*step];

Есть две проблемы с принятым ответом

  1. , вам не нужно транспонировать
  2. , вы должны включить шаг внутривектор, вместо умножения

и вот сравнение (извините, я запускаю 32-битный Matlab)

array=rand(10000);

s=size(array,1);
step=0.0001;
tic
for i=1:100000
array(:,1)=[step:step:s*step];
end
toc

и

tic
for i=1:100000
array(:, 1)=[1:s]'*step;
end
toc

результатыявляются:

Истекшее время составляет 3,469108 секунд.

Истекшее время составляет 5,304436 секунд.

и без транспонирования во втором примере

Истекшее время составляет 3,524345 секунд..

Полагаю, в вашем случае все будет хуже.

3 голосов
/ 19 марта 2012
array(:,1) = [1:size(array,1)]' * 0.001;

Matlab более эффективен при векторизации циклов, см. Также советы по повышению производительности от mathworks.

Если такая векторизация невозможна из-за нехватки места, вы можете пересмотреть переписываниеВаш цикл for в C, используя функцию MEX .

1 голос
/ 19 марта 2012

Вы также можете попробовать это

size=20000000;%size is defined

array(1:size,1)=(1:size)*0.001

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...