2015-09-26 3 views
1

Я провел эксперимент с направленными лучами, и я хотел бы визуализировать его. Установка была такой:MATLAB, Как визуализировать мой направленный луч Данные

setup

Я измерил свои значения в 22, 15, 10, 5 и 0 градусов на расстоянии 100, 75, 50 и 25 см.

Теперь я хотел бы привести эти данные в 3D waterfall() диаграммы, где источник находится самый высокий пик, и вы можете увидеть, что напряжение уменьшается во всех направлениях.

Итак, моя первая мысль заключалась в том, чтобы соответствовать всем расстояниям индивидуально, и эти функции я хотел бы поместить в waterfall(). Но это не очень хорошо, потому что начинаются и заканчиваются разные уровни значений (смотрите примерный код) после того, как я вычислил их в x, y система была другой.

Итак, как я могу привести свои данные в схему водопада?

clearvars 
x=-1:0.1:1; 

%________________________________________________________measured Values (layers) 
A=[208; 256; 480; 704; 776; 752; 672; 480; 264]; % 0.25m 
B=[104; 156; 304; 388; 432; 440; 340; 280; 140]; % 0.50m 
C=[ 54; 104; 250; 264; 320; 270; 252; 144; 70]; % 0.75m 
D=[ 32; 64; 142; 198; 228; 208; 130; 86; 46;]; % 1.00m 

% plot(A) 
% figure(2) 
% plot(B) 
% figure(3) 
% plot(C) 
% figure(4) 
% plot(D) 

%________________________________________________________to x,y System 
dist1=[tand(-22)*0.25; tand(-15)*0.25; tand(-10)*0.25; tand(-5)*0.25; tand(0)*0.25; tand(5)*0.25; tand(10)*0.25; tand(15)*0.25; tand(22)*0.25;]; 
dist2=[tand(-22)*0.50; tand(-15)*0.50; tand(-10)*0.50; tand(-5)*0.50; tand(0)*0.50; tand(5)*0.50; tand(10)*0.50; tand(15)*0.50; tand(22)*0.50;]; 
dist3=[tand(-22)*0.75; tand(-15)*0.75; tand(-10)*0.75; tand(-5)*0.75; tand(0)*0.75; tand(5)*0.75; tand(10)*0.75; tand(15)*0.75; tand(22)*0.75;]; 
dist4=[tand(-22);  tand(-15);  tand(-10);  tand(-5);  tand(0);  tand(5);  tand(10);  tand(15);  tand(22)]; 

plot(dist1,A) 
figure(2) 
plot(dist2,B) 
figure(3) 
plot(dist3,C) 
figure(4) 
plot(dist4,D) 

% func1= fit(dist1,A,'poly2') 
% 
% plot(dist1, func1(dist1)) 

Кроме того:

В результате я хотел бы создать что-то вроде этого:

enter image description here

http://de.mathworks.com/help/matlab/ref/waterfall.html

или, может быть поверхность:

http://de.mathworks.com/help/matlab/ref/surf.html

Но я не знаю, как я могу преобразовать мои текущие данные в формате, который соответствует требованиям функции waterfall() или surf()

+0

Что вы подразумеваете под диаграммой «_waterfall_» (если хотите, ссылку на существующее изображение) и каковы переменные 'ab1'' 'ab4' (как они построены)? – Hoki

+0

им жаль abs1-4 такие же, как dist1-4, я изменю это – chris

+0

, вы просто хотите, чтобы 4 графика были на одной и той же фигуре/оси? – Hoki

ответ

4

Это все об организации ваших данных. Как сказал Дэниел, waterfall (или даже surf) в этом случае требуется сетка (ваши данные должны быть матрицами).

Итак, давайте строить правильную сетку с вашими данными:

%% // measured Values (layers) 
A = [208; 256; 480; 704; 776; 752; 672; 480; 264] ; %// 0.25m 
B = [104; 156; 304; 388; 432; 440; 340; 280; 140] ; %// 0.50m 
C = [ 54; 104; 250; 264; 320; 270; 252; 144; 70] ; %// 0.75m 
D = [ 32; 64; 142; 198; 228; 208; 130; 86; 46] ; %// 1.00m 

%% // Building the mesh 
%// primary parameters 
x  = (0.25:0.25:1).' ;      %'// ignore that comment 
angles = [-22 -15 -10 -5 0 5 10 15 22] ; 

%// mesh matrices 
X = x * ones(1,numel(angles)) ; %// distance to source 
Y = x * tand(angles) ;   %// lateral spread due to angle 
V = [A B C D].' ;    %'// measurements (voltages) 

На данный момент, у вас есть 3 матрицы X, Y и V, которые идеально подходят для ввода большинства 3D функций построения графиков, как surf или waterfall.Таким образом, становится довольно просто:

%% // Waterfall visualisation 
hf = figure ; 
hw = waterfall(X,Y,V) ; 

Если вы хотите добавить некоторые уточнения:

%% // refinements 
shading interp 
xlabel('Distance to source') 
ylabel('Lateral spread') 
zlabel('Voltage') 
hold on 
plot3(0,0,0,'or','MarkerSize',10,'LineWidth',4) %// show the source position 

и/или даже больше информации на рисунке:

%% // displays the base rays 
xrays = [0;x] ; 
yrays = [zeros(1,numel(angles)) ; Y] ; 

set(0,'DefaultAxesColorOrder',[0 0 0] , 'DefaultAxesLineStyleOrder','--|:') 
plot(xrays,yrays,'Marker','.') 

На этом этапе дает следующий рисунок, но вы можете сохранить его простым или настроить многие другие свойства всего графического объекта для персонализации вашего дисплея: waterfall


Вы также можете играть с surf функции вместо waterfall, и использовать те же матрицы, в качестве входных данных.


Другой способ лучше связать напряжение, записанную для каждого положения датчика будет использовать stem сюжет. К сожалению, функция stem не принимает 3D массивов в качестве входных данных, однако, ZData свойства еще существует, поэтому мы можем создать экземпляр стволового участка первым затем петлю через них, чтобы установить их ZData:

%% // STEM waterfall variant 
hsf = figure ; hold on 
hs = stem(X.',Y.',':ob') ; 
for k=1:4 
    set(hs(k),'ZData',V(k,:)) 
end 

Со всеми выше уточнениями, его выходы:

stem waterfall

Этот вариант не код цвета напряжение, но оно показывает точно положение, в котором он был записан.

1

Самый простой способ заключается в сетке данных первого (т.е. положить их в X, Y и Z) матриц:

%Z: 
dist1234=[dist1 dist2 dist3 dist4]; 
%Y: 
ABCD=[A B C D]; 
%X: 
[n1,n2]=size(ABCD); 
X=repmat(1:n2,n1,1); % or whatever your x-axis is, here it is 1, 2, 3... 

% Take your pick: 
figure(1) 
surf(X,dist1234,ABCD);title('surf') 
figure(2) 
waterfall(X',dist1234',ABCD');title('waterfall') 
figure(3) 
mesh(X,dist1234,ABCD);title('mesh') 

DEOS3.png JDS9r.png kpIrW.png

Смежные вопросы