2009-07-14 6 views
2

Результат, например, >>w = whos;, возвращает массив структур. Я хотел бы построить массив, элементы которого являются скалярами от определенного имени поля в каждой структуре.MATLAB: собирать из массива структур

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

>> w(1:2).bytes 
ans = 
    64 
ans = 
    128 

Я мог бы сделать это с помощью петли, но задавался вопросом, есть ли более хороший способ.

ответ

10

в квадратных скобках выражения, т.е.

[w(1:2).bytes] 
+0

10 красивый, спасибо! – second

2

В таких ситуациях, используя cat более общее назначение. Предположим, вы хотите сделать то же самое с кучей строк, то [] метод не будет работать, и вы должны были бы использовать:

cat(1,w(1:2).class) 

И в приведенном выше случае,

cat(1,w(1:2).bytes) 

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

+0

Приведенный выше код выдает ошибку, если строки имеют одинаковую длину. Вы должны использовать STRVCAT в таком случае. – gnovice

+0

Спасибо! Я буду помнить об этом. – Jacob

6

Доступ к полю для массива структур будет возвращаться как результат comma-separated list (или CSL). Другими словами, выход из вашего примера:

w(1:2).bytes 

эквивалентно печатать:

64, 128 

Таким образом, вы можете использовать выход в любом месте, где может быть использован CSL. Вот несколько примеров:

a = [w(1:2).bytes];   % Horizontal concatenation = [64, 128] 
a = horzcat(w(1:2).bytes); % The same as the above 
a = vertcat(w(1:2).bytes); % Vertical concatenation = [64; 128] 
a = {w(1:2).bytes};   % Collects values in a cell array = {64, 128} 
a = zeros(w(1:2).bytes); % Creates a 64-by-128 matrix of zeroes 
b = strcat(w.name);   % Horizontal concatenation of strings 
b = strvcat(w.name);  % Vertical concatenation of strings 
Смежные вопросы