Можно получить среднее значение для разных файлов, чтобы сделать некоторые вычисления с ним после? - PullRequest
0 голосов
/ 15 апреля 2019

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

%%% - Loading the file of each experiment
myfiles = dir('*.lvm');     % To load every file of .lvm

for i = 1:length(myfiles)   % Loop with the number of files
    files=myfiles(i).name;
    mydata(i).files = files;
    mydata(i).T = fileread(files);
    arraymean(i) = mean(mydata(i));
end

Файлы, которые мне нужно вычислить, более или менее похожи на следующие:

Delta_X 3.000000    3.000000    3.000000
***End_of_Header*** 
X_Value C_P1N1  C_P1N2  C_P1N3
0.000000    -0.044945   -0.045145   -0.045705
0.000000    -0.044939   -0.045135   -0.045711
3.000000    -0.044939   -0.045132   -0.045706
6.000000    -0.044938   -0.045135   -0.045702

1 Ответ

0 голосов
/ 16 апреля 2019

Ваша первая строка приводит к тому, что myfiles является структурным массивом с компонентами, которые вы определите, когда наберете «help dir». В частности, имена всех файлов содержатся в элементе структуры myfiles (i) .name. Чтобы отобразить все имена файлов, введите myfiles.name. Все идет нормально. В цикле for вы используете 'fileread', но fileread (см. Справку fileread) возвращает строку символов, а не фактические значения. Я назвал ваш файл-прототип .lvm DinaF.lvm, и я написал очень простую функцию для чтения данных в этом файле, пропустив первые три строки и сохранив следующую матрицу, в которой предполагается, что в ней есть 4 столбца. массив с именем T внутри функции и arrayT в основной программе

Вот модифицированный скрипт, в который включена функция read_lvm для чтения вашего lvm-файла модели.

'1' в первой строке сообщает Octave, что в сценарии есть нечто большее, чем просто следующая функция: основная программа также должна интерпретироваться.

1;
function T=read_lvm(filename)
  fid = fopen (filename, "r");
  %% Skip by first three lines
  for lhead=1:3
    junk=fgetl(fid);
  endfor
  %% Read nrow lines of data, quit when file is empty
  nrow=0;
  while (! feof (fid) )
    nrow=nrow + 1;
    thisline=fscanf(fid,'%f',4);
    T(nrow,1:4)=transpose(thisline);
  endwhile
  fclose (fid);
endfunction

## main program

myfiles = dir('*.lvm');     % To load every file of .lvm

for i = 1:length(myfiles)   % Loop with the number of files
  files=myfiles(i).name;
  arrayT(i,:,:) = read_lvm(files);
  columnmean(i,1:4)=mean(arrayT(i,:,:))
end

Теперь табличные значения, связанные с каждым файлом .lvm, находятся в массиве arrayT, а среднее значение для этого набора данных - в columnmean (i, 1: 4). Если i> 1, то columnmean будет массивом, в котором каждая строка будет содержать файлы для каждого файла lvm. T

Эта дискуссия становится слишком далекой от первоначального вопроса. Я рад продолжать помогать. Если вам нужна дополнительная помощь, закройте эту дискуссию, приняв мой ответ (щелкните на swish), а затем задайте новый вопрос с заголовком «Как читать файлы .lvm в Octave». Таким образом, вы получите представление от многих других людей.

...