2016-10-12 2 views

ответ

2

Если вы

s.a = 1:4; 

Matlab не создает структуру автоматически, нет необходимости в первой строке.

Чтобы получить разницу производительности между двумя версиями, а также версии Erfan (см комментарии под вопросом) использовать timeit:

t1 = timeit(@no_preallocation); 
t2 = timeit(@no_preallocation2); 
t3 = timeit(@preallocation); 

function no_preallocation() 
    s.a = 1:4; 
end 

function no_preallocation2() 
    s=struct('a',1:4); 
end 

function preallocation() 
    s = struct('a',[]); 
    s.a = 1:4; 
end 

я

t1 = 1.3965e-06 
t2 = 7.1217e-06 
t3 = 7.1223e-06 

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

Однако следует помнить, что НЕ предварительное выделение может привести к странному поведению, особенно в сценариях, потому что вы на самом деле не удаление структура s, прежде чем вы назначаете поле а, что означает, что если у вас s в памяти до присвойте, вы сохраните его и просто перепишете, что может быть не предполагаемым поведением. Поэтому предположение, предложенное Эдриком и Эрфаном, кажется лучшим.

+0

@ihcgeneva В общем, моя структура может иметь два поля типов массивов. Поэтому мы должны сделать s.a = 1: 4; s.b = 5: 8; Я в порядке с этим. Имеет ли это добавление динамического поля какие-либо проблемы с производительностью? –

+0

Это не честный тест - в первом случае вы только создаете массив в первый раз вокруг цикла. – Edric

+1

... первый тест должен быть действительно 's = []; s.a = 1: 4'. Однако это все равно в 4 раза быстрее, чем использование 'struct' на моей машине. – Edric

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