Как создать проекцию поля структур, содержащихся внутри вектора в Matlab? - PullRequest
2 голосов
/ 18 марта 2012

Я хочу это (массив = вектор):

array.Select(elem => elem.my_field).ToArray(); // C# + Linq
array map _.my_field // Scala, I believe

На простом английском у меня есть вектор.Каждый элемент является структурой.Каждая структура имеет поле (любого вида).Теперь вместо этого я хотел бы иметь вектор «полей».

Пример:

Итак, если изначально у меня был вектор структуры name + age (см. Обновление ниже)Я хотел бы создать проекцию, поэтому я получаю вектор возрастов (последовательность возрастов).

Я попробовал arrayfun функцию, но это дает мне ошибку:

error: cellfun: все значения должны быть скалярами, когда UniformOutput = true

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

ОБНОВЛЕНИЕ: Я слишком упрощен в этом примере, извините - возраст - это число, но время от времени это пара чисел.Так что в общем случае я должен предположить, что это может быть вектор чисел любой длины (как я понимаю в Matlab число есть vector.length = 1).

Вопрос

Как сделать такую ​​«комбинированную» проекцию в Matlab?

1 Ответ

3 голосов
/ 18 марта 2012

Вы можете использовать cat для объединения вашего массива:

s = struct('age',{10 20 20},'name',{'Bob','Max','Peter'})
1x3 struct array with fields:
    age
    name

age = cat(1,s.age)
age =
    10
    20
    20

Если вы хотите использовать arrayfun, вы бы сделали следующее:

age = arrayfun(@(x)x.age,s);

РЕДАКТИРОВАТЬ

Для объединения структуры, поля которой имеют неизвестную длину, есть два варианта: Если вы просто хотите, чтобы все "возрасты", и не имеет значения, что "возраст" # 5 заканчиваетсяв позиции 6, поскольку для "age" # 2 было две записи, вы объединяете их вдоль измерения, где все ваши "age" массивы имеют одинаковую длину.Например, если все они массивы 1x1 или 1x2 или 1x3 и т. Д., Вы пишете

age = cat(2,s.age);

Если, альтернативно, вы хотите, чтобы элемент № 2 вашего выходного массива имел две записи (потому что s(2).ageбыло две записи), вы попадаете в CELL ARRAY

age = {s.age};

Каждый элемент age (доступный через скобки) представляет собой массив ячеек 1x1, который может содержать любой класс массивалюбой размер;для доступа к содержимому элемента массива ячеек вы используете фигурные скобки: age(2) - второй элемент массива ячеек, age{2} - содержимое указанного элемента, то есть ваш массив 1x2номера.

...