MATLAB: собрать из массива структур - PullRequest
2 голосов
/ 14 июля 2009

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

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

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

Я мог бы сделать это с помощью цикла, но мне было интересно, есть ли лучший способ.

Ответы [ 3 ]

10 голосов
/ 14 июля 2009

Поставьте квадратные скобки вокруг выражения, т.е.

[w(1:2).bytes]
6 голосов
/ 14 июля 2009

Доступ к полю для массива структур вернет в качестве вывода список через запятую (или 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
2 голосов
/ 14 июля 2009

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

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

И в случае выше,

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

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

...