#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»