#matlab #plot #octave
#matlab #построение #октава
Вопрос:
Я пытаюсь отобразить прикрепленные данные в octave. 1-й столбец — это значения X, 2-й — значение Y, а последний — значения Z.
Я запускаю этот скрипт:
xVec = reshape(mat(:,1),25,9);
yVec = reshape(mat(:,2),25,9);
zVec = reshape(mat(:,3),25,9);
surf(xVec,yVec,zVec);
axis([0.15 0.85 0.15 0.85]);
set(gca, 'XTick',0.20:0.05:0.80);
set(gca, 'YTick',0.20:0.05:0.80);
Но я продолжаю получать неровную поверхность, которую очень трудно понять. Почему это так? Чего мне не хватает?
Данные:
0.15 0.15 40.802
0.15 0.2 40.673
0.15 0.25 40.526
0.15 0.3 40.83
0.15 0.35 40.862
0.15 0.4 40.652
0.15 0.45 40.924
0.15 0.5 40.774
0.15 0.55 41.088
0.15 0.6 40.749
0.15 0.65 41.099
0.15 0.7 41.753
0.15 0.75 41.607
0.15 0.8 41.911
0.15 0.85 41.537
0.2 0.15 39.809
0.2 0.2 39.884
0.2 0.25 40.595
0.2 0.3 40.497
0.2 0.35 40.863
0.2 0.4 41.325
0.2 0.45 40.916
0.2 0.5 40.431
0.2 0.55 40.583
0.2 0.6 40.858
0.2 0.65 40.548
0.2 0.7 41.668
0.2 0.75 41.863
0.2 0.8 41.499
0.2 0.85 41.903
0.25 0.15 39.894
0.25 0.2 39.686
0.25 0.25 40.227
0.25 0.3 40.625
0.25 0.35 40.572
0.25 0.4 41.034
0.25 0.45 40.828
0.25 0.5 40.802
0.25 0.55 40.196
0.25 0.6 40.493
0.25 0.65 41.265
0.25 0.7 40.963
0.25 0.75 41.023
0.25 0.8 41.396
0.25 0.85 41.596
0.3 0.15 39.546
0.3 0.2 40.216
0.3 0.25 39.535
0.3 0.3 39.945
0.3 0.35 40.108
0.3 0.4 40.726
0.3 0.45 40.187
0.3 0.5 41.279
0.3 0.55 40.747
0.3 0.6 41.122
0.3 0.65 40.91
0.3 0.7 40.292
0.3 0.75 41.04
0.3 0.8 41.287
0.3 0.85 42.023
0.35 0.15 38.693
0.35 0.2 40.269
0.35 0.25 40.561
0.35 0.3 40.536
0.35 0.35 40.268
0.35 0.4 39.947
0.35 0.45 40.259
0.35 0.5 40.146
0.35 0.55 41.048
0.35 0.6 40.263
0.35 0.65 40.875
0.35 0.7 41.281
0.35 0.75 40.836
0.35 0.8 41.322
0.35 0.85 41.734
0.4 0.15 39.321
0.4 0.2 39.103
0.4 0.25 39.694
0.4 0.3 40.529
0.4 0.35 40.272
0.4 0.4 39.826
0.4 0.45 40.224
0.4 0.5 40.808
0.4 0.55 40.66
0.4 0.6 40.003
0.4 0.65 41.626
0.4 0.7 41.549
0.4 0.75 41.523
0.4 0.8 41.408
0.4 0.85 41.545
0.45 0.15 39.428
0.45 0.2 39.53
0.45 0.25 39.988
0.45 0.3 40.039
0.45 0.35 40.075
0.45 0.4 40.206
0.45 0.45 40.946
0.45 0.5 41.027
0.45 0.55 41.214
0.45 0.6 40.98
0.45 0.65 40.874
0.45 0.7 41.483
0.45 0.75 41.151
0.45 0.8 41.123
0.45 0.85 40.528
0.5 0.15 39.477
0.5 0.2 39.62
0.5 0.25 40.265
0.5 0.3 39.61
0.5 0.35 40.109
0.5 0.4 40.232
0.5 0.45 40.212
0.5 0.5 40.861
0.5 0.55 39.665
0.5 0.6 41.225
0.5 0.65 40.577
0.5 0.7 40.62
0.5 0.75 41.244
0.5 0.8 40.977
0.5 0.85 41.753
0.55 0.15 39.033
0.55 0.2 39.769
0.55 0.25 40.164
0.55 0.3 40.351
0.55 0.35 40.592
0.55 0.4 40.227
0.55 0.45 40.14
0.55 0.5 40.734
0.55 0.55 40.429
0.55 0.6 40.701
0.55 0.65 40.849
0.55 0.7 40.596
0.55 0.75 41.481
0.55 0.8 41.27
0.55 0.85 40.755
0.6 0.15 38.944
0.6 0.2 39.76
0.6 0.25 39.051
0.6 0.3 40.009
0.6 0.35 39.84
0.6 0.4 40.072
0.6 0.45 41.282
0.6 0.5 40.606
0.6 0.55 40.98
0.6 0.6 41.141
0.6 0.65 40.111
0.6 0.7 41.627
0.6 0.75 41.798
0.6 0.8 41.196
0.6 0.85 41.35
0.65 0.15 39.457
0.65 0.2 39.38
0.65 0.25 40.26
0.65 0.3 40.142
0.65 0.35 39.935
0.65 0.4 40.496
0.65 0.45 39.862
0.65 0.5 40.665
0.65 0.55 40.187
0.65 0.6 40.955
0.65 0.65 39.834
0.65 0.7 40.641
0.65 0.75 41.162
0.65 0.8 41.028
0.65 0.85 41.54
0.7 0.15 38.938
0.7 0.2 39.803
0.7 0.25 39.485
0.7 0.3 39.8
0.7 0.35 39.459
0.7 0.4 39.895
0.7 0.45 40.203
0.7 0.5 40.222
0.7 0.55 40.176
0.7 0.6 41.01
0.7 0.65 41.433
0.7 0.7 41.651
0.7 0.75 41.018
0.7 0.8 41.185
0.7 0.85 41.216
0.75 0.15 39.182
0.75 0.2 38.856
0.75 0.25 39.992
0.75 0.3 40.005
0.75 0.35 39.613
0.75 0.4 39.526
0.75 0.45 40.232
0.75 0.5 40.45
0.75 0.55 41.157
0.75 0.6 40.578
0.75 0.65 41.106
0.75 0.7 41.252
0.75 0.75 40.773
0.75 0.8 41.207
0.75 0.85 42.219
0.8 0.15 39.33
0.8 0.2 39.463
0.8 0.25 39.435
0.8 0.3 40.252
0.8 0.35 39.819
0.8 0.4 39.826
0.8 0.45 40.506
0.8 0.5 41.031
0.8 0.55 40.666
0.8 0.6 41.306
0.8 0.65 40.674
0.8 0.7 41.489
0.8 0.75 40.956
0.8 0.8 41.61
0.8 0.85 41.099
0.85 0.15 39.247
0.85 0.2 38.983
0.85 0.25 39.051
0.85 0.3 39.098
0.85 0.35 39.617
0.85 0.4 40.541
0.85 0.45 40.091
0.85 0.5 40.435
0.85 0.55 40.55
0.85 0.6 40.204
0.85 0.65 40.682
0.85 0.7 40.965
0.85 0.75 41.063
0.85 0.8 41.113
0.85 0.85 41.577
Ответ №1:
Ну, насколько я вижу в ваших данных, значения X меняются каждые 15 пунктов, так же как и Y и Z. Кажется, вы неправильно изменяете форму.
Попробуйте внести следующие действительно небольшие изменения в свой код:
xVec = reshape(data(:,1),15,15);
yVec = reshape(data(:,2),15,15);
zVec = reshape(data(:,3),15,15);
surf(xVec,yVec,zVec);
axis([0.15 0.85 0.15 0.85]);
set(gca, 'XTick',0.20:0.05:0.80);
set(gca, 'YTick',0.20:0.05:0.80);
Вывод:
Комментарии:
1. ВАУ, СПАСИБО! Я часами ломал голову, ты прав!
Ответ №2:
(Это верно только для matlab, поэтому я не знаю, отличается ли octav, но я так не думаю.)
Проблема в том, что surf нуждается в очень специфическом формате ввода, он не работает с векторами.
нужная вам функция griddata
интерполирует любые входные данные 3D или 4D в четной сетке (что было бы необходимым вводом surf).
Это работает примерно так:
xVec=mat(:,1);
yVec=mat(:,2);
zVec=mat(:,3);
gridpoints = 100;
[xi, yi] = meshgrid(linspace(min(xVec),max(xVec),gridpoints),linspace(min(xVec),max(xVec),gridpoints));
zi = griddata(xVec,yVec,zVec,xi,yi);
surf(xi,yi,zi);