Построение поверхности в октаве приводит к неоднородной поверхности?

#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);