В MATLAB, если мы делаемМожем ли мы создать структуру полей массива напрямую?
struct('a',1:4)
создает массив структур ... То, что я хотел это
s = struct('a',[]);
s.a = 1:4;
Можем ли мы сделать это в одной команде?
В MATLAB, если мы делаемМожем ли мы создать структуру полей массива напрямую?
struct('a',1:4)
создает массив структур ... То, что я хотел это
s = struct('a',[]);
s.a = 1:4;
Можем ли мы сделать это в одной команде?
Если вы
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
в памяти до присвойте, вы сохраните его и просто перепишете, что может быть не предполагаемым поведением. Поэтому предположение, предложенное Эдриком и Эрфаном, кажется лучшим.
@ihcgeneva В общем, моя структура может иметь два поля типов массивов. Поэтому мы должны сделать s.a = 1: 4; s.b = 5: 8; Я в порядке с этим. Имеет ли это добавление динамического поля какие-либо проблемы с производительностью? –
Это не честный тест - в первом случае вы только создаете массив в первый раз вокруг цикла. – Edric
... первый тест должен быть действительно 's = []; s.a = 1: 4'. Однако это все равно в 4 раза быстрее, чем использование 'struct' на моей машине. – Edric
О 'struct ('a', 1: 4)' Я получаю структуру с одним полем 'a: [1 2 3 4]'. (R2015b) – erfan