2015-03-09 2 views
1

я работаю в среде MATLAB и у меня есть некоторые структуры, как это:Как выбрать некоторые данные в структуре массива

>> HTC_01 

HTC_01 = 

    Name: 'HTC_One_M8-2015-02-11-15-40-30' 
    Date: '2015-02-11' 
    Time: [395768x1 double] 
     Ax: [395768x1 double] 
     Ay: [395768x1 double] 
     Az: [395768x1 double] 
    Lat: [395768x1 double] 
    Lon: [395768x1 double] 
    Quo: [395768x1 double] 
    Vel: [395768x1 double] 

Теперь я хочу выбрать некоторые данные, например, (4646: 279745) из всех массивов и поместить вывод в новый массив с тем же именем этого.

Я хотел бы получить:

>> HTC_02 = my_resize(HTC_01, 4646, 279745) 

HTC_02 = 

    Name: 'HTC_One_M8-2015-02-11-15-40-30' 
    Date: '2015-02-11' 
    Time: [275100x1 double] 
     Ax: [275100x1 double] 
     Ay: [275100x1 double] 
     Az: [275100x1 double] 
    Lat: [275100x1 double] 
    Lon: [275100x1 double] 
    Quo: [275100x1 double] 
    Vel: [275100x1 double] 

Вопрос: Я должен сделать это один массив, массив, или есть более короткий путь, чтобы сделать это?

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

+0

Выберите эти данные и сохранить, как и что? – Divakar

+0

@Divakar Матрица или другой массив. Для меня то же самое. И благодарю вас. –

+0

Как сохранить выходные данные как другую переменную, которая не является структурой? То есть, где каждый столбец будет соответствовать данным из одного из полей? – Divakar

ответ

1

Работает только с полями массива в структуры:

fields = fieldnames(HTC); 
i = 1; 

for x = 1:length(fields) 
    field = fields{x}; 
    data = getfield(HTC,field); 
    if isa(data,'double') 
     output(:,i) = data(4646:279745); 
     i = i + 1; 
    end 
end 

Каждый диапазон массива данных требуется сохраняется в виде столбца в выходном массиве.

ОБНОВЛЕНО ПОСЛЕ ВАШЕЙ UPDATE:

function output = my_resize(input,r1,r2) 

fields = fieldnames(input); 
output = input; 

for x = 1:length(fields) 
    field = fields{x}; 
    data = getfield(input,field); 
    if isa(data,'double') 
     output = setfield(output,field,data(r1:r2,1)); 
    end 
end 
+0

Большое спасибо. Я не спрашивал решение «все включено», но еще раз спасибо. –

+1

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

1

Это будет один подход -

index_range = 4646:279745      %// index range 
flds = {'Ax','Ay','Az','Lat','Lon','Quo','Vel'} %// fields to be selected 
fnames = fieldnames(HTC_01)      %// all fieldnames 

%// Logical array with length as number of fields 
%// and ones where the fields to be selected appear 
idx = ismember(fnames,flds) 

C = struct2cell(HTC_01) %// Get all of the data into a cell array 
out1 = reshape([C{idx}],[],sum(idx)).'   %//'#select fields 
out2 = out1(:,index_range)      %// select data from range 
cell_out = mat2cell(out2,ones(1,size(out2,1)),size(out2,2)) 

%// Store truncated data into numeric fields and then save back as struct 
C(idx) = cell_out 
out = cell2struct(C,fnames,1) 
Смежные вопросы