2015-01-06 2 views
0

У меня есть массив внутри массива, и я пытаюсь назвать переменные, используя цикл for, поскольку существует много переменных. Когда я использую следующий простой код Time1 = dataCOMB{1,1}{1,1}(1:1024, 1);, он открывает первую ячейку в массиве и переходит к открытию первой ячейки в следующем массиве и, наконец, определяет все значения в столбцах 1 строки 1 - 1024 как Time1. Однако у меня 38 из этих различных наборов данных и когда я применить следующий код:Как назвать переменные в массиве данных с помощью цикла for

for t = 1:38 
    for aa = 1:38 
     Time(t) = dataCOMB{1,1}{1,aa}(1:1024, 1); 
    end 
end 

я получаю ошибку

В присваивания A (I) = В, число элементов в B и я должны быть одинаковыми.

Ошибка в Load_Files_working (строка 39)
Время (t) = dataCOMB {1,1} {1, aa} (1: 1024, 1);

В основном я пытаюсь получить MATLAB назвать первый столбец в каждой наборе данных Time1, Time2 и т.д.

+0

Что вы пытаетесь do копирует содержимое 'dataCOMB' в' Time (t) ', что не то же самое, что и переименование, потому что изменение' Time (t) 'не изменит' dataCOMB'. Вы просто читаете «dataCOMB» или будете писать там? – knedlsepp

ответ

0

Ваша ошибка с Time(t). Это не то, как вы создаете новую переменную в matlab. Для того, чтобы делать то, что вы хотите (то есть, создавать имена переменных Time1, Time2 и т.д ... Вы должны будете использовать eval функцию:.

for aa = 1:38 
    eval(['Time' num2str(aa) '= dataCOMB{1,1}{1,aa}(1:1024,1);']); 
end 

Многие люди не любят рекомендовать функцию eval Другие Wouldn» Рекомендуем переместить все данные из структуры данных и в их собственные независимые переменные. Таким образом, для решения этих двух критических замечаний лучшей альтернативой может быть вытащить ваши данные из вашей сложной структуры данных и поместить ее в более простой массив:

Time_Array = zeros(1024,38); 
for aa = 1:38 
    Time_Array(:,aa) = dataCOMB{1,1}{1,aa}(1:1024,1); 
end 

Или, если вам не нравится, что bec AUSE вы действительно похожи на имена Time1, Time2 и т.д., вы можете создать их в качестве полей в структуре данных:

Time_Data = []; 
for aa = 1:38 
    fieldname = ['Time' num2str(aa)]; 
    Time_Data.(fieldname) = dataCOMB{1,1}{1,aa}(1:1024,1); 
end 

И в ответ на комментарии ниже по первоначальному сообщению, этот метод может быть расширен для дальнейшего распаковывать данные:

Time_Data = []; 
count = 0; 
for z = 1:2; 
    for aa = 1:38 
     count = count+1; 
     fieldname = ['Time' num2str(count)]; 
     Time_Data.(fieldname) = dataCOMB{1,z}{1,aa}(1:1024,1); 
    end 
end 
+1

Умм, давайте лучше проигнорируем подход 'eval' вообще. – knedlsepp

+0

Можете ли вы добавить текст, чтобы помочь OP понять, почему следует избегать подхода 'eval'? – chipaudette

+0

Спасибо за помощь, это сработало :) У меня есть еще один вопрос. Есть ли способ, когда при назначении первых 38 переменных я могу обновить следующую строку 'Time_Data. (Fieldname) = dataCOMB {1, z} {1 , aa} (1: 1024,1); 'где z теперь будет обновляться до числа 2 вместо 1, как и раньше. Это позволит мне назвать вторую партию переменных Time39 - Time 76 и так далее? – Jerry

1

проблема:

1) Вы хотели бы извлечь в ряд клеток ...

2) ... первые 1024 номера в 1-й колонке ...

3) ... из каждой из первых 38 ячеек массива ячеек.

План:

1) Если кто-то хочет получить информацию от каждого элемента массива ячеек (то есть массив доступен через {} индексации), можно использовать cellfun. Вызов cellfun(some_function, a_cell_array) будет агрегировать результаты some_function(a_cell_array{k}) для всех возможных k индексов. Если результаты являются гетерогенными (т.е.не имеющие одного и того же типа и размера), можно использовать опцию cell_fun(..., 'UniformOutput', false), чтобы поместить их в массив выходных ячеек (массивы ячеек хороши при группировке гетерогенных данных).

2) Для того, чтобы извлечь первые 1024 чисел из первого столбца в числовом массиве x один может использовать эти анонимных функцию: @(x) x(1:1024,1). Аргумент x будет соответствовать каждому элементу массива ячеек, а наша анонимная функция будет играть роль some_function на шаге выше.

3) Теперь нам нужно указать a_cell_array, то есть массив ячеек, содержащий первые 38 ячеек цели. Это было бы просто dataCOMB{1,1}(1,1:38).

Решение:

Это один лайнер реализует план:

Time = cellfun(@(x) x(1:1024,1), dataCOMB{1,1}(1,1:38), 'UniformOutput', false); 

Затем вы можете получить доступ к данным, как в этом примере:

this_time = Time{3}; 
+0

Очень впечатляет. ИМО, для нового человека может возникнуть трудность разбора. Тем не менее, это тур-де-сила жесткого программирования. Вау. – chipaudette

+0

@chipaudette О, ты мне льстишь. :-) IMHO, однострочники - это немного потоковое сознание, поэтому они не легко читаемы. Я изменю свой ответ, чтобы он был более выразительным и, следовательно, менее впечатляющим. :-) –

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