Я пытаюсь импортировать числа между скобками в Matlab. Я использую программное обеспечение OpenFoam, которое создает файл, извлекающий значения скорости (u, v, w) в нескольких разных положениях для разных временных шагов. Я хотел бы импортировать эти скорости, чтобы я мог взять их среднее значение за определенный временной интервал. У меня около 250 датчиков в моем домене потока, что означает, что я хотел бы импортировать 750 разных чисел для нескольких разных временных шагов. Файл выглядит так:

введите описание изображения здесь Ссылка на файл: https://drive.google.com/file/d/1CuoflLADasCUybs/file/d/1Cuofl4ADasCUybs/ просмотреть? usp = sharing

Поэтому я хотел бы импортировать все числа в матрицу с размером ((количество временных шагов) X (зонды))

Я нашел код, который действительно работает и импортирует эти числа, но это очень ручная работа. Мне пришлось бы написать probexx (i, :) = (str2double (split (out {i, 1} {1, xx}))) '; вручную 250 раз, чтобы заставить его работать. Я хотел бы иметь более автоматический код, чтобы можно было легко изменять количество зондов. Может ли кто-нибудь мне помочь?

Заранее спасибо!

id = fopen('probe.dat','r');

t = textscan(id,'%s','delimiter',sprintf('\n'));
fclose(id);

out = regexp(t{1,1}(6:end-3), '(?<=\()[^)]*(?=\))', 'match', 'all');

probe0 = zeros(size(out,1),3);
probe1 = zeros(size(out,1),3);

for i = 1:size(out,1)
    if ~isempty(out{i,:})
        probe0(i,:) = (str2double(split(out{i,1}{1,1})))';
        probe1(i,:) = (str2double(split(out{i,1}{1,2})))';
    else
        probe0(i,:) = [0,0,0];
        probe1(i,:) = [0,0,0];
    end

end
1
euroshopper 26 Фев 2018 в 15:41

1 ответ

Лучший ответ

Я бы сделал это так, предполагая, что каждая строка однородна после строк заголовка.

id = fopen('probes.dat','r');
t = textscan(id,'%f','Delimiter',{'(',')',' '},'MultipleDelimsAsOne',true,'headerlines',5);
fclose(id);

numProbes = 254;
temp = reshape(t{1},numProbes*3+1,[]);

outData.time = temp(1,:).';
for ii = 1:numProbes
    rowIdx = (ii-1)*3+2:(ii-1)*3+4;
    outData.(num2str(ii,'probe%d')) = temp(rowIdx,:).';
end

В основном считайте все числовые данные в 1 массив. Использование функции нескольких разделителей и указание количества строк заголовка. Затем измените форму в зависимости от количества зондов (в вашем примере DAT было 254).

Затем переберите количество зондов, чтобы назначить их полям структуры с нужными вам именами переменных (probeXX).

Это оставляет вам структуру формы:

outData = 

        time: [47x1 double]
      probe1: [47x3 double]
      probe2: [47x3 double]
      probe3: [47x3 double]
      ...
      probe254: [47x3 double]
2
Aero Engy 26 Фев 2018 в 18:20