У меня есть следующие данные:
M = 1000; % [seconds]
D = 50; % number of masses
t = [0:dt:M];
y = randn(length(t),1); % [unitless] amplitude
z = [1:1:2*D]; % [unitless] number of eigenfrequencies
data = [t,y,z];
Я хотел бы создать поверхностный график data
, где ось X — это t
или время, ось Y — это y
или амплитуда, а ось Z — это число собственных частот. Данные x и y имеют размерность t
, но данные z имеют размерность 2D
. Можно ли построить график данных x, y, z, используя данные z с размерностью, отличной от данных x и y в MATLAB, используя surf()
или plot3()
?
Обновлено: Это был плохо сформулированный вопрос. Идея заключалась в том, чтобы построить график данных x,y,z с использованием разных измерений, что просто невозможно.
И если вам нужна поверхность, ваши входные данные должны быть матрицами. Вы можете легко преобразовать t
и y
в матрицы, используя сетку, но (как указано выше) вам придется найти значение z
в каждой паре (t,y)
.
Я думаю, что вопрос неправильно или неправильно сформулирован. Есть ли опечатки в коде или описании? Чего именно вы хотите? Технически возможно сделать то, что вы просили (используя [a,b,c] = meshgrid(t,y,z); figure; plot3(a(:),b(:),c(:),'.');
), но я не уверен, что это поможет..
Прямой ответ на ваш вопрос (Можно ли построить график данных x, y, z, используя данные z с размерностью, отличной от данных x и y), будет «Нет». x
, y
и z
должны иметь одинаковое количество компонентов для создания графика. Это немного похоже на XY-проблему. Возможно, будет полезно, если вы объясните немного больше, для чего предназначен этот код и почему вы считаете, что описанный график является хорошим визуальным представлением ваших данных.
Я не понимаю, какой результат вы хотите получить. Как ваши значения z связаны со значениями (x,y)? На поверхности у вас есть определенная высота (значение z) для каждой комбинации координат (x,y). Но ваши данные этого не делают, поэтому они не представляют собой поверхность.
Это был плохо сформулированный вопрос. Идея заключалась в том, чтобы построить график данных x,y,z с использованием разных измерений, что просто невозможно.
Да, вы можете использовать plot3
, чтобы построить график. Чтобы устранить несоответствие длины, обратите внимание: вам просто нужно добавить один элемент к z
, чтобы его длина была одинаковой с t
и y
.
dt = 1;
M = 100; % [seconds]
D = 50; % number of masses
t = [0:dt:M];
y = randn(length(t),1); % [unitless] amplitude
z = [1:1:2*D+1]; % [unitless] number of eigenfrequencies
figure
plot3(t,y,z,'LineWidth', 2);
xlabel('t')
ylabel('y')
zlabel('z')
Результат:
Если вы измените измерения t
и y
, вам необходимо соответствующим образом обновить измерение z
. Как я понимаю из вашего вопроса, вы хотите, чтобы z
было что-то от 1
до 2*D
(в два раза больше количества масс). Допустим, вы хотите изменить продолжительность времени на 1000
, вы можете использовать linspace
, чтобы выбрать правильный размер шага для z
.
M = 1000; % [seconds]
D = 50; % number of masses
dt = 1;
t = [0:dt:M];
y = randn(length(t),1); % [unitless] amplitude
%z = [1:1:2*D]; % [unitless] number of eigenfrequencies
z = linspace(1,2*D,length(t));
Результат:
По чистой случайности M оказывается равным 2D. Что бы вы сделали, если бы М было, скажем, 1000? (См. отредактированный вопрос)
@Jonathan Frutschy Тогда вам нужно изменить его на правильное измерение, иначе вы не сможете его построить.
@JonathanFrutschy Я обновил ответ на ваш запрос. Дайте мне знать, если вы этого хотите.
Да, это лучшее, о чем я мог мечтать (см. редактирование исходного сообщения)
Вам нужно будет установить связь между вашими параметрами. Для каждой комбинации (t,y) вам понадобится значение z, чтобы создать поверхность. Если у вас нет функции, определяющей это отношение,
f(t,y) = z
, вы не сможете этого сделать. Другими словами, с точки зрения MATLAB, вам понадобится столько же точек вz
, сколько у вас есть вt
иy
, иначе вы допустите ошибку. Показательный пример:data
невозможно создать в вашем текущем коде, так какz
содержит меньше элементов, чемt
илиy
. Чтобы сделать это, вам нужно будет найти больше элементовz
.