Как прочитать нужные диапазоны строк в текстовом файле и назначить элементы этих диапазонов для разных матриц в MATLAB? - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть текстовый файл, в котором есть несколько элементов:

5
4
4 3 1 4
3 1 2 1
9 8 1 3
4 Inf Inf 4
13 9 Inf 6
1 3
2 3
3 4
4 5
-1 -1

Мне нужно создать 2 разные матрицы с этими элементами.Первые два элемента в первых двух строках (здесь 5 и 4) соответствуют размеру (mxn) первой матрицы (в этом примере матрица 5x4).Я должен назначить следующие mxn элементы (от row2 до row5, всего 20 элементов здесь) в матрицу.После этого оставшиеся значения до последней строки (которая имеет -1 -1) должны быть назначены другой матрице pxt (В этом примере матрица 4x2. Строка с -1 -1 указывает конец строки.)

Я буду использовать много текстовых файлов, и количество строк и столбцов в них различаются (размеры создаваемых матриц различны.), Поэтому мне нужно написать коды, которые могут запускать всетекстовые файлы.Я пытался написать кусок кода, но его результаты неверны, потому что между значениями есть пустые пробелы, и программа считает эти пробелы символами.Кроме того, 13 и Inf имеют более одного персонажа.Вот мой код и результат для первой матрицы.Кроме того, мне нужно создать вторую матрицу, как я объясняю, но я не знаю, как это сделать.

clear;
clc;
fileID=fopen('1.txt', 'r'); 
nrow = fscanf(fileID,'%d',1);
ncolumn = fscanf(fileID,'%d',1);
maxrix1 = zeros(nrow,ncolumn);

a = 1;
nline = 1;
while ~feof(fileID) && nline<nrow+2
    line = fgetl(fileID); 
    if(nline > 1 && nline<=nrow+2)
        for b = 1:ncolumn
        if ~ischar(line), break, end
            maxrix1(a, b) = str2double(line(b));
        end
        a = a + 1;
    end
    nline = nline + 1;
end

fclose(fileID);

Вот результат, который я получил, но это не так из-запустые места и элементы, которые имеют более одного символа (Inf и 13)

4   NaN 3   NaN
3   NaN 1   NaN
9   NaN 8   NaN
4   NaN NaN NaN
1   3   NaN 9

Должно быть:

4 3 1 4
3 1 2 1
9 8 1 3
4 Inf Inf 4
13 9 Inf 6

После исправления кода для создания matrix1 мне нужно создатьматрица2 так:

1 3
2 3
3 4
4 5

1 Ответ

0 голосов
/ 26 декабря 2018

Вот как я бы подошел к проблеме:

fid = fopen('file.txt');
M = str2double(fgetl(fid));
N = str2double(fgetl(fid));

matrix1 = NaN(M,N); % initiallize and preallocate
for m = 1:M
    li = fgetl(fid); % read next line
    matrix1(m,:) = str2double(strsplit(li, ' ')); % avoid str2num
end

matrix2 = []; % initiallize. We cannot preallocate
while true % we will exit explicitly with a break statement
    li = fgetl(fid); % read next line. Gives -1 if end of file
    if ~isequal(li, -1)
        matrix2(end+1,:) = str2double(strsplit(li, ' ')); % avoid str2num
    else
        break
    end
end
matrix2(end,:) = []; % remove last row, which contains [-1 -1]

fclose(fid)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...