matlab 从矩阵中读取特定数字

matlab read specific numbers from matrix

这是我的问题:

我有一个包含以下数据(示例)的文件:

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。

感谢大家的帮助

首先,如果 X 和 Y 之间的距离始终为 4,为什么不从样本矩阵中删除前 5 个数字?

M = sample(:,6:end)

你的 X 是第一列,所以

X = sample(:,1)

现在您可以为每个 X 绘制 Y

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

您可以直接对矩阵进行索引以获得所需的值。

在您的情况下,这将如下所示:

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 将其转换为数值数组。