matlab считывает определенные числа из матрицы

Вот моя проблема:

У меня есть файл, содержащий следующие данные (образец):

kptn wtk kptc(3) eiglist(:)
1 1.00000 0.0000 -0.5000 0.0000 -8.65212 -8.65212 -2.54501 -2.54501
2 1.00000 0.0000 -0.4500 0.0000 -9.31361 -7.93027 -3.19370 -3.19370
3 1.00000 0.0000 -0.4000 0.0000 -9.90932 -7.14566 -3.77996 -3.77996
4 1.00000 0.0000 -0.3500 0.0000 -10.43755 -6.30634 -4.30047 -4.30047

Для моего графика мне нужно только самое первое число (1..число строк минус первое) как значение X, а числа после 5-го числа в строке как мои значения Y. Поэтому для каждой строки у меня будет несколько значений Y. Итак, в конце для каждой строки у меня должно быть что-то вроде этого:

X=[1], Y=[-8.65212, -8.65212, -2.54501, -2.54501]

вторая линия:

X=[2], Y=[-9.31361, -7.93027, -3.19370, -3.19370]

Однако количество значений Y может варьироваться от файла к файлу, но количество значений между X и Y всегда будет равно 4.

Спасибо за помощь


person Anton B    schedule 06.01.2015    source источник


Ответы (2)


Вы можете напрямую индексировать матрицу, чтобы получить нужные значения.

В вашем случае это будет выглядеть так:

Data = [1 1.00000 0.0000 -0.5000 0.0000 -8.65212 -8.65212 -2.54501 -2.54501;
2 1.00000 0.0000 -0.4500 0.0000 -9.31361 -7.93027 -3.19370 -3.19370;
3 1.00000 0.0000 -0.4000 0.0000 -9.90932 -7.14566 -3.77996 -3.77996;
4 1.00000 0.0000 -0.3500 0.0000 -10.43755 -6.30634 -4.30047 -4.30047]

%// As for your comment, to start from line 2 use `Data(2:end,whatever)`
DatatoPlot = [Data(2:end,1) Data(2:end,6:end)]; %// Get the appropriate data using indexing

Использование квадратных скобок [] указывает Matlab объединять данные, т.е. помещать все данные один за другим в указанном вами порядке (здесь по горизонтали);

Следовательно, DatatoPlot выглядит так:

DatatoPlot =

    1.0000   -8.6521   -8.6521   -2.5450   -2.5450
    2.0000   -9.3136   -7.9303   -3.1937   -3.1937
    3.0000   -9.9093   -7.1457   -3.7800   -3.7800
    4.0000  -10.4375   -6.3063   -4.3005   -4.3005

Затем вы можете построить результат (или также использовать scatter):

%// Display the result
figure
hold on
for k = 1:size(DatatoPlot,1)

plot(k,DatatoPlot(k,2:end),'*-') %// Y values correspond to 2nd column until the end.

end

xlim([0 5]) %// To see data more clearly
set(gca,'Xtick',[1:5])

Давая это:

введите описание изображения здесь

Который, конечно, вы можете настроить по своему усмотрению.

ИЗМЕНИТЬ

Судя по вашему комментарию, вы можете использовать importdata для загрузки данных. Например:

filename = YourFileName;
delimiterIn = ' '; %// Values are separated by a white space
headerlinesIn = 1; %// There is 1 headerline, which you want to skip.

Data = importdata(filename,delimiterIn,headerlinesIn);

Теперь данные должны быть числовым массивом, поскольку все значения являются числами. Если это массив ячеек, вы можете использовать cell2mat для преобразования его в числовой массив.

person Benoit_11    schedule 06.01.2015
comment
Как мне заполнить ДАННЫЕ из файла, пропустив первую строку? - person Anton B; 06.01.2015
comment
См. Отредактированный ответ. Вам нужно использовать Data (2: end, что угодно), чтобы начать со строки 2 - person Benoit_11; 06.01.2015
comment
Я понимаю. Но после того, как я открою файл fid = fopen ('filename'), как мне поместить данные из файла в DATA. Потому что вы заполнили ДАННЫЕ вручную. Извините, если я что-то упускаю, но это моя первая попытка в Matlab. - person Anton B; 06.01.2015
comment
хорошо, я только что обновил свой ответ. Вероятно, вы захотите использовать importdata. - person Benoit_11; 06.01.2015

Во-первых, почему бы не вырезать первые 5 чисел из вашей выборочной матрицы, если расстояние между X и Y всегда равно 4?

M = sample(:,6:end)

ваш X - это первый столбец, поэтому

X = sample(:,1)

Теперь вы можете построить Y для каждого X

figure
for n = 1:length(X)
   plot(whatever you wish to plot)
end
person GameOfThrows    schedule 06.01.2015