2015-10-08 2 views
0

Я хочу загрузить файл csv в Matlab с помощью testread(), так как данные в нем содержат более 2 миллионов записей, поэтому я должен предварительно выделить массив для этих данных.Зачем использовать repmat() для расширения массива?

Предположим, что я не могу точно знать длину массивов, документы MATLAB v6.5 рекомендуют мне использовать repmat() для моего расширяющегося массива. Оригинальные слова в документе ниже:.

«В тех случаях, когда вы не можете заранее выделить, если вы можете увеличить размер вашего массива с помощью функции repmat repmat пытается получить вы непрерывный блок памяти для вашего расширяющегося массива ».

Я действительно не знаю, как использовать repmat для расширения?

Означает ли это, оценивая грубый номер длины для repmat() для предварительного распределения, а затем удалять пустые элементы?

Если да, то как это отличается от предварительного распределения с использованием zeros() или cell()?

ответ

3

Документация также говорит:

Когда вы предварительно выделить блок памяти для хранения матрицы некоторого типа другой чем в два раза, это меньше памяти, а иногда и быстрее использовать функцию repmat для этого ,

В приведенном ниже описании используются нули для выделения матрицы 100 на 100 из uint8. Он делает это, сначала создавая полную матрицу удвоений, а затем преобразует матрицу в uint8. Это требует времени и использует память без необходимости.

A = int8(zeros(100)); 

Использование repmat, вы создаете только один двойной, таким образом, уменьшая вашу память потребности.

A = repmat(int8(0), 100, 100); 

Таким образом, преимущество заключается в том, если вы хотите, типа данных, кроме двойников, вы можете использовать repmat для репликации без двойного типа данных.

Смотри также: http://undocumentedmatlab.com/blog/preallocation-performance, что предполагает:

data1(1000,3000) = 0 

вместо:

data1 = zeros(1000,3000) 

, чтобы избежать инициализации других элементов.

Что касается динамического изменения размера, repmat может быть использован для сжато удвоить размер вашего массива (общий метод, который приводит к амортизационной O (1) добавляет для каждого элемента):

data = [0]; 
i = 1; 
while another element 
    ... 
    if i > numel(data) 
     data = repmat(data,1,2); % doubles the size of data 
    end 
    data(i) = element 
    i = i + 1; 
end 

И да, после того, как вы собрали все свои элементы, вы можете изменить размер массива, чтобы удалить пустые элементы в конце.

+1

Благодарим вас за подробный и быстрый ответ, также ссылки очень полезны. –

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