Octave - почему серф не работает, а трисёрф работает? - PullRequest
0 голосов
/ 26 октября 2018

Я могу построить диаграмму трисурфа, но серфинг не работает.

Что я делаю не так?

pkg load statistics;
figure (1,'name','Matrix Map');
colormap('hot');
t = dlmread('C:\Map3D.csv');
tx =t(:,1);ty=t(:,2);tz=t(:,3);
tri = delaunay(tx,ty);
handle = surf(tx,ty,tz); #This does NOT work
#handle = trisurf(tri,tx,ty,tz);  #This does work

`ошибка: поверхность: строки (Z) должны совпадать с длиной (Y), а столбцы (Z) должны совпадать с длиной (X)

Мои данные в формате CSV (запятые здесь не показаны)

1   2   -0.32
2   2   0.33
3   2   0.39
4   2   0.09
5   2   0.14
1   2.5 -0.19
2   2.5 0.13
3   2.5 0.15
4   2.5 0.24
5   2.5 0.33
1   3   0.06
2   3   0.44
3   3   0.36
4   3   0.45
5   3   0.51
1   3.5 0.72
2   3.5 0.79
3   3.5 0.98
4   3.5 0.47
5   3.5 0.55
1   4   0.61
2   4   0.13
3   4   0.44
4   4   0.47
5   4   0.58
1   4.5 0.85

1 Ответ

0 голосов
/ 26 октября 2018

surf сообщение об ошибке отличается в Matlab или в октаве.

Сообщение об ошибке от Matlab:

Z должна быть матрицей, а не скаляром или вектором .

Проблема здесь довольно ясна, поскольку вы указали Z (для вас tz) как вектор.

Сообщение об ошибке от Octave:

поверхность: строки (Z) должны совпадать с длиной (Y), а столбцы (Z) должны совпадать с длиной (X)

Вы здесь не правы, поскольку в вашем примере столбцы (Z) = 1, но длина (X) = 26, поэтому здесь есть ошибка.

Одним из последствий этого является то, что с surf у вас не может быть «дыр» или неопределенных точек на вашей сетке. В вашем случае у вас есть X-сетка от 1 до 5 и Y-сетка от 2 до 4.5, но точка координаты (2, 4.5) не определена.


@ Луис Мендо, Matlab и Octave допускают использование прототипа surf(matrix_x, matrix_y, matrix_z), но третий аргумент matrix_z все еще должен быть матрицей (а не скаляром или вектором). По-видимому, матрица только из одной строки или столбца не считается матрицей.


Чтобы решить проблему, я предлагаю что-то вроде:

tx = 1:5; % tx is a vector of length 5
ty = 2:0.5:4.5; % ty is a vector of length 6
tz = [-0.32 0.33 0.39 0.09 0.14;
      -0.19 0.13 0.15 0.24 0.33;
       0.06 0.44 0.36 0.45 0.51;
       0.72 0.79 0.98 0.47 0.55;
       0.61 0.13 0.44 0.47 0.58;
       0.85 0.   0.   0.   0.]; % tz is a matrix of size 6*5
surf(tx,ty,tz);

Обратите внимание, что мне пришлось изобрести некоторые значения в точках, где ваша сетка не была определена, я поставил 0., но вы можете изменить его на значение, которое вы предпочитаете.

...