2016-09-24 3 views
3

Предположим, что у меня есть структура, называемая I размера n * 1, с несколькими полями, одна из которых называется «область», например. Когда я пытаюсь код ниже:Как извлечь все значения из определенного поля структуры n * 1 в Matlab

area = I.area 

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

for ii = 1:n; area(ii) = I(ii).area; end 

ответ

1

Используя простой [] вокруг структуры приведет к горизонтальной конкатенации всех значений. Если вы хотите связать их по другому измерению, вы можете использовать cat, чтобы указать это явно. Это позволит вам лучше обрабатывать поля, которые могут содержать несколько значений.

% Concatenate them along the first dimension 
out = cat(1, I.area); 

% Concatenate them along the third dimension 
out = cat(2, I.area); 

В качестве альтернативы, если поля являются всеми различных размеров, а затем превратить их в cell

out = {I.area}; 
+0

Спасибо за ваш ответ !! – jingweimo

1
area = [I.area] 

I.area возвращает все значения I(1).area, I(2).area ... как разделенный запятыми список, который могут быть подключены туда, где такой список ожидается, например список параметров функции или инициализацию массива.

EDIT: Если все I(i).area - это вектор строки с равным размером. Тогда вы можете сначала сцепить все из них горизонтально, а затем изменить форму до нужной размерности:

area = reshape([I.area], [2 length(I)])' 

Результат:

>> I.area 

ans = 

    3  4 


ans = 

    5  6 


ans = 

    7  8 

>> reshape([I.area], [2 length(I)])' 

ans = 

    3  4 
    5  6 
    7  8 
+0

Это работает, если поле области имеет одно значения в каждом положении, например, I (1) .area = 1. Что делать, если запись имеет два значения I (1) .area = [1, 2]? Можно ли извлечь эти значения так же, как они структурированы как матрица, а не сформированы в столбце или строке. Например: – jingweimo

+0

Если I (1) .area = [1, 2], I (2) .area = [3, 4], я хочу, чтобы выход был [1, 2; 3, 4]. – jingweimo

+0

Если вы намерены обратиться к случаям, когда 'area' является вектором 2x1, скажите так прямо в своем вопросе в следующий раз, чтобы ответчики не угадали, что вы на самом деле имеете в виду. И эта строка 'area (ii) = I (ii) .area;' настоятельно предлагает 'I.area' является скаляром. В любом случае, векторная' area' может быть легко обработана с помощью 'reshape'. Я отредактировал свой ответ, чтобы отразить это. –

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

  • Нет связанных вопросов^_^