Как я могу создавать/обрабатывать переменные в цикле в MATLAB?

Мне нужно рассчитать среднее значение, стандартное отклонение и другие значения для ряда переменных, и мне было интересно, как использовать цикл в своих интересах. У меня есть 5 электродов данных. Итак, чтобы вычислить среднее значение каждого, я делаю это:

mean_ch1 = mean(ch1);  
mean_ch2 = mean(ch2);  
mean_ch3 = mean(ch3);  
mean_ch4 = mean(ch4);  
mean_ch5 = mean(ch5);  

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

for i = 1:5  
  mean_ch(i) = mean(ch(i));  
end

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


person user379362    schedule 29.06.2010    source источник


Ответы (3)


У вас есть несколько вариантов того, как вы можете это сделать:

  • Вы можете сначала поместить все данные канала в одну большую матрицу, а затем вычислить среднее значение строк или столбцов с помощью функции СРЕДНЕЕ. Например, если каждая переменная chX представляет собой массив размером N на 1, вы можете сделать следующее:

    chArray = [ch1 ch2 ch3 ch4 ch5];  %# Make an N-by-5 matrix
    meanArray = mean(chArray);        %# Take the mean of each column
    
  • Вы можете сначала поместить все данные канала в массив ячеек, а затем вычислить среднее значение каждой ячейки с помощью функции CELLFUN:

    meanArray = cellfun(@mean,{ch1,ch2,ch3,ch4,ch5});
    

    Это будет работать, даже если каждый массив chX имеет разную длину.

  • Вы можете использовать EVAL для создания отдельных переменных для каждого канал означает:

    for iChannel = 1:5
      varName = ['ch' int2str(iChannel)];  %# Create the name string
      eval(['mean_' varName ' = mean(' varName ');']);
    end
    
person gnovice    schedule 29.06.2010
comment
Если у вас есть такие наборы данных, массивы/векторы — это наиболее подходящий путь в Matlab. Использование векторных операций приведет к значительно более быстрому коду (в большинстве случаев) по сравнению с использованием циклов/итераторов. - person bta; 29.06.2010
comment
Спасибо за ваш ответ, это помогло мне значительно сократить кодирование. Первый не разделял массив, как хотелось бы, но работал. Второй не работал для моего MATLAB, @mean, кажется, вызывает проблему. EVAL сработал идеально, как я и хотел, большое спасибо. - person user379362; 30.06.2010

Если это всегда ровно 5 каналов, вы можете сделать

ch = {ch1, ch2, ch3, ch4, ch5}
for j = 1:5
    mean_ch(j) = mean(ch{j});
end

Более сложный способ был бы

for j = 1:nchannels
    mean_ch(j) = eval(['mean(ch' num2str(j) ')']);
end
person Marc    schedule 29.06.2010

Помимо ответа gnovice. Вы можете использовать структуры и имена динамических полей для выполнения своей задачи. Сначала я предполагаю, что все переменные данных вашего канала имеют формат ch* и являются единственными переменными в вашем рабочем пространстве MATLAB. Вы можете сделать что-то вроде следующего

%# Move the channel data into a structure with fields ch1, ch2, ....
%# This could be done by saving and reloading the workspace
save('channelData.mat','ch*');
chanData = load('channelData.mat');

%# Next you can then loop through the structure calculating the mean for each channel
flds = fieldnames(chanData); %# get the fieldnames stored in the structure

for i=1:length(flds)
     mean_ch(i) = mean(chanData.(flds{i});
end
person Azim J    schedule 29.06.2010