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

#octave

#октава

Вопрос:

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

 %%% - 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. Пожалуйста, укажите код, который работает, и сообщите нам, в чем ошибка.

2. Привет, проблема в том, что я не знаю, что теперь делать. Ошибка гласит: «X должен быть числовым вектором или матрицей». Насколько я понимаю, до сих пор у меня есть массив, который хранит имена файлов, но я не понимаю, как вычислить внутреннюю часть каждого файла. Извините, если вопрос глупый, но я не так много знаю о программировании. Я выполнил программу, перед которой получил массив с первыми пятью значениями каждого столбца, а затем я смог использовать этот массив и значения исходного файла, но это было для одного файла, и теперь со многими я не совсем понимаю, как это работает.

Ответ №1:

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

Вот модифицированный скрипт, в который включена функция read_lvm для чтения вашего ‘model’ файла 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, то значение столбца будет представлять собой массив, каждая строка которого содержит файлы для каждого файла lvm. T

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

Комментарии:

1. Большое вам спасибо за объяснение, это было действительно полезно. Раньше я пытался использовать load files, но я получил ошибку ‘load: невозможно определить формат файла ‘tension1.lvm’, так как файлы содержат текст в первых строках. В коде, который я написал для чтения одного файла, я использовал ‘dlmread’, но когда я использовал его здесь, я получаю ‘dlmread: аргументом ФАЙЛА должна быть строка или идентификатор файла’. Итак, я использовал ‘csvread’, но ответом является единственное значение для каждого файла, а не массив (оно дает среднее значение 1-го столбца каждого файла, но не массив со средним значением всех столбцов каждого файла). У вас есть какие-либо предложения?. Еще раз спасибо.

2. Можете ли вы отредактировать свой вопрос, чтобы включить первые несколько строк tension1.lvm?

3. Вы имеете в виду вот так ?.

4. Да, пожалуйста, посмотрите мой отредактированный ответ. Если вам нужны дополнительные ответы, пожалуйста, закройте это обсуждение, приняв мой ответ, и начните новый вопрос с таким названием, как «Как читать файлы .lvm в Octave»