3d Graphing Data in matlab and changing the axis values - matlab
I am trying to do a 3d graph of a excel file that is 343 by 81 cells, The first column needs to be the X and the first row needs to be the Y and the remaining matrix needs to be the Z. I have the data successfully imported from excel and I create a matrix of the first column called energy (343,1)(x-axis), while creating a row matrix (1, 81) called Time Delay(y-axis) and a (343,81) matrix where the first column and row is zero called Absorbance Change(Z-axis). I've got the proper 3d graph that I need but I need the axes shown in the graph to be that of the Energy and Time Delay instead of the indices of the Absorbance Change matrix. I am putting the relevant portion of the code below as well as a picture of the graph:
EnergyString = dataArray{:, 1};
EnergyString(1,1) = {'0'};
Energy = str2double(EnergyString);
%Energy = [ Energy, zeros(343, 80) ];
TimeDelay = [ z1(1,1), z2(1,1), z3(1,1), z4(1,1), z5(1,1), z6(1,1), z7(1,1), z8(1,1), z9(1,1), z10(1,1), z11(1,1), z12(1,1), z13(1,1), z14(1,1), z15(1,1), z16(1,1), z17(1,1), z18(1,1), z19(1,1), z20(1,1), z21(1,1), z22(1,1), z23(1,1), z24(1,1), z25(1,1), z26(1,1), z27(1,1), z28(1,1), z29(1,1), z30(1,1), z31(1,1), z32(1,1), z33(1,1), z34(1,1), z35(1,1), z36(1,1), z37(1,1), z38(1,1), z39(1,1), z40(1,1), z41(1,1), z42(1,1), z42(1,1), z43(1,1), z44(1,1), z45(1,1), z46(1,1), z47(1,1), z48(1,1), z49(1,1), z50(1,1), z51(1,1), z52(1,1), z53(1,1), z54(1,1), z55(1,1), z56(1,1), z57(1,1), z58(1,1), z59(1,1), z60(1,1), z61(1,1), z62(1,1), z63(1,1), z64(1,1), z65(1,1), z66(1,1), z67(1,1), z68(1,1), z69(1,1), z70(1,1), z71(1,1), z72(1,1), z73(1,1), z74(1,1), z75(1,1), z76(1,1), z77(1,1), z78(1,1), z79(1,1), z80(1,1) ];
%TimeDelay = [ TimeDelay; zeros(342, 81)];
startRow formatSpec filename fileID delimiter ans EnergyString Alpha Beta Gamma Delta Epsilon Zeta Eta Theta Iota Kappa Lambda Mu Nu Xi Omicron Pi Rho Sigma Tau Upsilon Phi Chi Psi Omega AlphaAlpha AlphaBeta AlphaGamma AlphaDelta AlphaEpsilon AlphaZeta AlphaEta AlphaTheta AlphaIota AlphaKappa AlphaLambda AlphaMu AlphaNu AlphaXi AlphaOmicron AlphaPi AlphaRho AlphaSigma AlphaTau AlphaUpsilon AlphaPhi AlphaChi AlphaPsi AlphaOmega BetaAlpha BetaBeta BetaGamma BetaDelta BetaEpsilon BetaZeta BetaEta BetaTheta BetaIota BetaKappa BetaLambda BetaMu BetaNu BetaXi BetaOmicron BetaPi BetaRho BetaSigma BetaTau BetaUpsilon BetaPhi BetaChi BetaPsi BetaOmega GammaAlpha GammaBeta GammaGamma GammaDelta GammaEpsilon GammaZeta GammaEta GammaTheta; %Delete Excess Varaible
AbsorbanceChange = [ zeros(343, 1), z1, z2, z3, z4, z5, z6, z7, z8, z9, z10, z11, z12, z13, z14, z15, z16, z17, z18, z19, z20, z21, z22, z23, z24, z25, z26, z27, z28, z29, z30, z31, z32, z33, z34, z35, z36, z37, z38, z39, z40, z41, z42, z43, z44, z45, z46, z47, z48, z49, z50, z51, z52, z53, z54, z55, z56, z57, z58, z59, z60, z61, z62, z63, z64, z65, z66, z67, z68, z69, z70, z71, z72, z73, z74, z75, z76, z77, z78, z79, z80];
AbsorbanceChange(1,:) = 0;
clear z1 z2 z3 z4 z5 z6 z7 z8 z9 z10 z11 z12 z13 z14 z15 z16 z17 z18 z19 z20 z21 z22 z23 z24 z25 z26 z27 z28 z29 z30 z31 z32 z33 z34 z35 z36 z37 z38 z39 z40 z41 z42 z43 z44 z45 z46 z47 z48 z49 z50 z51 z52 z53 z54 z55 z56 z57 z58 z59 z60 z61 z62 z63 z64 z65 z66 z67 z68 z69 z70 z71 z72 z73 z74 z75 z76 z77 z78 z79 z80;
mesh(AbsorbanceChange)
colorbar
title('WS2-Perovskite-image')
xlabel('Energy') % x-axis label
ylabel('Time-delay') % y-axis label
zlabel('Absorbance Change')
When I type help mesh in MATLAB I see, among other thins, this:
mesh(x,y,Z) and mesh(x,y,Z,C), with two vector arguments replacing
the first two matrix arguments, must have length(x) = n and
length(y) = m where [m,n] = size(Z). In this case, the vertices
of the mesh lines are the triples (x(j), y(i), Z(i,j)).
Note that x corresponds to the columns of Z and y corresponds to
the rows.
Thus, you can do
mesh(Energy, TimeDelay, AbsorbanceChange);
I don't know how you read the data from file, but there is a better way than specifying each cell individually in your code.
Related
Plotting graphs for point cloud data
(Example) Point cloud data Consider a matrix N x 36, where N is the number of points in the point cloud data (3D object) and 36 columns represent the features extracted of which the last 3 columns are (x, y, z) coordinate values of every point. Now I wish to perform feature analysis in this regard I would like to know how to plot/represent/describe each feature from f1,f2,...f33 over the (x,y,z) coordinates for which they were computed? (to understand the behavior of features) Is this possible? How? If not, what is the alternative? Eg: find 2 features file bunny_example with NX5 where N is number of points, 1st and 2nd columns are features 1f1, f21 and 3rd to 5th columns are (x,y,z) coordinate values.
This code may help you: % Provided example data features = [2.0684e-05 7.5750e-06 3.8389e-05 1.0346e-05 -8.3302e-06; 0.0002 -1.7019e-05 -0.0002 -3.8879e-05 8.1841e-05; -2.3888e-05 -3.5798e-05 2.0476e-05 -4.7382e-05 3.8213e-05; 7.7594e-06 2.9854e-06 3.0756e-05 -1.9135e-06 1.3463e-05; 3.4250e-05 5.6627e-06 7.3759e-06 -8.1303e-05 -1.5577e-05; 4.7731e-06 4.9014e-06 2.5750e-05 2.3827e-06 6.2936e-06; 2.4317e-05 0.0007 3.1783e-05 0.0001 -0.0001; 2.6632e-05 0.0009 0.0001 0.0001 -0.0005; -1.9714e-05 -1.2456e-06 5.5657e-06 1.8092e-05 1.3787e-05]; points = [-0.6011 -0.9712 0.3268; -0.5721 -0.9712 0.3379; -0.5721 -0.9854 0.32794; -0.5817 -0.948 0.3298; 0.0708 -0.583 -0.2528; -0.5721 -0.9429 0.32794; -0.312 -0.9940 0.4074; -0.286 -0.994 0.4174; -0.0864 0.4534 -0.7729]; % To create the colormap - like heatmap initial_hsv = [0 1 1]; % red final_hsv = [2/3 1 1]; % blue point_size = 10; max_hsv = max([initial_hsv; final_hsv]); min_hsv = min([initial_hsv; final_hsv]); dif_hsv = max_hsv - min_hsv; % For each feature for f = 1 : size(features, 2) f_max = max(features(:, f)); f_min = min(features(:, f)); c_data = zeros(size(points, 1), 3); % For each point for p = 1 : size(points, 1) for hsv_comp = 1:3 if dif_hsv(hsv_comp) != 0 % Logaritmic mapping c_data(p, hsv_comp) = (1 - ((log(features(p, f)+abs(f_min)+1) - log(f_min+abs(f_min)+1)) / (log(f_max+abs(f_min)+1) - log(f_min+abs(f_min)+1)))) * dif_hsv(hsv_comp) + min_hsv(hsv_comp); else c_data(p, hsv_comp) = min_hsv(hsv_comp); end end end % Converting to HSV c_data(:,:) = hsv2rgb(c_data(:,:)); % Creating a figure for each feature str = sprintf('Feature number %d' , f); figure scatter3(points(:,1), points(:,2), points(:,3), point_size*ones(size(points,1),1), c_data); title(str) end NOTES: You can change the values of inital_hsv, final_hsv and point_size according to your needs. The way the c_data is computed (in this example is used a logaritmic mapping) can also be changed in order to have smother color transitions based on your feature data.
How to interpolate random non monotonic increasing data
So I am working on my Thesis and I need to calculate geometric characteristics of an airfoil. To do this, I need to interpolate the horizontal and vertical coordinates of an airfoil. This is used for a tool which will calculate the geometric characteristics automatically which come from random airfoil geometry files. Sometime the Y values of the airfoil are non monotonic. Hence, the interp1 command gives an error since some values in the Y vector are repeated. Therefore, my question is: How do I recognize and subsequently interpolate non monotonic increasing data automatically in Matlab. Here is a sample data set: 0.999974 0.002176 0.994846 0.002555 0.984945 0.003283 0.973279 0.004131 0.960914 0.005022 0.948350 0.005919 0.935739 0.006810 0.923111 0.007691 0.910478 0.008564 0.897850 0.009428 0.885229 0.010282 0.872617 0.011125 0.860009 0.011960 0.847406 0.012783 0.834807 0.013598 0.822210 0.014402 0.809614 0.015199 0.797021 0.015985 0.784426 0.016764 0.771830 0.017536 0.759236 0.018297 0.746639 0.019053 0.734038 0.019797 0.721440 0.020531 0.708839 0.021256 0.696240 0.021971 0.683641 0.022674 0.671048 0.023367 0.658455 0.024048 0.645865 0.024721 0.633280 0.025378 0.620699 0.026029 0.608123 0.026670 0.595552 0.027299 0.582988 0.027919 0.570436 0.028523 0.557889 0.029115 0.545349 0.029697 0.532818 0.030265 0.520296 0.030820 0.507781 0.031365 0.495276 0.031894 0.482780 0.032414 0.470292 0.032920 0.457812 0.033415 0.445340 0.033898 0.432874 0.034369 0.420416 0.034829 0.407964 0.035275 0.395519 0.035708 0.383083 0.036126 0.370651 0.036530 0.358228 0.036916 0.345814 0.037284 0.333403 0.037629 0.320995 0.037950 0.308592 0.038244 0.296191 0.038506 0.283793 0.038733 0.271398 0.038920 0.259004 0.039061 0.246612 0.039153 0.234221 0.039188 0.221833 0.039162 0.209446 0.039064 0.197067 0.038889 0.184693 0.038628 0.172330 0.038271 0.159986 0.037809 0.147685 0.037231 0.135454 0.036526 0.123360 0.035684 0.111394 0.034690 0.099596 0.033528 0.088011 0.032181 0.076685 0.030635 0.065663 0.028864 0.055015 0.026849 0.044865 0.024579 0.035426 0.022076 0.027030 0.019427 0.019970 0.016771 0.014377 0.014268 0.010159 0.012029 0.007009 0.010051 0.004650 0.008292 0.002879 0.006696 0.001578 0.005207 0.000698 0.003785 0.000198 0.002434 0.000000 0.001190 0.000000 0.000000 0.000258 -0.001992 0.000832 -0.003348 0.001858 -0.004711 0.003426 -0.005982 0.005568 -0.007173 0.008409 -0.008303 0.012185 -0.009379 0.017243 -0.010404 0.023929 -0.011326 0.032338 -0.012056 0.042155 -0.012532 0.052898 -0.012742 0.064198 -0.012720 0.075846 -0.012533 0.087736 -0.012223 0.099803 -0.011837 0.111997 -0.011398 0.124285 -0.010925 0.136634 -0.010429 0.149040 -0.009918 0.161493 -0.009400 0.173985 -0.008878 0.186517 -0.008359 0.199087 -0.007845 0.211686 -0.007340 0.224315 -0.006846 0.236968 -0.006364 0.249641 -0.005898 0.262329 -0.005451 0.275030 -0.005022 0.287738 -0.004615 0.300450 -0.004231 0.313158 -0.003870 0.325864 -0.003534 0.338565 -0.003224 0.351261 -0.002939 0.363955 -0.002680 0.376646 -0.002447 0.389333 -0.002239 0.402018 -0.002057 0.414702 -0.001899 0.427381 -0.001766 0.440057 -0.001656 0.452730 -0.001566 0.465409 -0.001496 0.478092 -0.001443 0.490780 -0.001407 0.503470 -0.001381 0.516157 -0.001369 0.528844 -0.001364 0.541527 -0.001368 0.554213 -0.001376 0.566894 -0.001386 0.579575 -0.001398 0.592254 -0.001410 0.604934 -0.001424 0.617614 -0.001434 0.630291 -0.001437 0.642967 -0.001443 0.655644 -0.001442 0.668323 -0.001439 0.681003 -0.001437 0.693683 -0.001440 0.706365 -0.001442 0.719048 -0.001444 0.731731 -0.001446 0.744416 -0.001443 0.757102 -0.001445 0.769790 -0.001444 0.782480 -0.001445 0.795173 -0.001446 0.807870 -0.001446 0.820569 -0.001446 0.833273 -0.001446 0.845984 -0.001448 0.858698 -0.001448 0.871422 -0.001451 0.884148 -0.001448 0.896868 -0.001446 0.909585 -0.001443 0.922302 -0.001445 0.935019 -0.001446 0.947730 -0.001446 0.960405 -0.001439 0.972917 -0.001437 0.984788 -0.001441 0.994843 -0.001441 1.000019 -0.001441 First column is X and the second column is Y. Notice how the last values of Y are repeated. Maybe someone can provide me with a piece of code to do this? Or any suggestions are welcome as well. Remember I need to automate this process. Thanks for your time and effort I really appreciate it!
There is quick and dirty method if you do not know the exact function defining the foil profile. Split your data into 2 sets, top and bottom planes, so the 'x' data are monotonic increasing. First I imported your data table in the variable A, then: %// just reorganise your input in individual vectors. (this is optional but %// if you do not do it you'll have to adjust the code below) x = A(:,1) ; y = A(:,2) ; ipos = y > 0 ; %// indices of the top plane ineg = y <= 0 ; %// indices of the bottom plane xi = linspace(0,1,500) ; %// new Xi for interpolation ypos = interp1( x(ipos) , y(ipos) , xi ) ; %// re-interp the top plane yneg = interp1( x(ineg) , y(ineg) , xi ) ; %// re-interp the bottom plane y_new = [fliplr(yneg) ypos] ; %// stiches the two half data set together x_new = [fliplr(xi) xi] ; %% // display figure plot(x,y,'o') hold on plot(x_new,y_new,'.r') axis equal As said on top, it is quick and dirty. As you can see from the detail figure, you can greatly improve the x resolution this way in the area where the profile is close to the horizontal direction, but you loose a bit of resolution at the noose of the foil where the profile is close to the vertical direction. If it's acceptable then you're all set. If you really need the resolution at the nose, you could look at interpolating on x as above but do a very fine x grid near the noose (instead of the regular x grid I provided as example). if your replace the xi definition above by: xi = [linspace(0,0.01,50) linspace(0.01,1,500)] ; You get the following near the nose: adjust that to your needs.
To interpolate any function, there must be a function defined. When you define y=f(x), you cannot have the same x for two different values of y because then we are not talking about a function. In your example data, neither x nor y are monotonic, so anyway you slice it, you'll have two (or more) "y"s for the same "x". If you wish to interpolate, you need to divide this into two separate problems, top/bottom and define proper functions for interp1/2/n to work with, for example, slice it horizontally where x==0. In any case, you would have to provide additional info than just x or y alone, e.g.: x=0.5 and y is on top. On the other hand, if all you want to do is to insert a few values between each x and y in your array, you can do this using finite differences: %// transform your original xy into 3d array where x is in first slice and y in second xy = permute(xy(85:95,:), [3,1,2]); %// 85:95 is near x=0 in your data %// lets say you want to insert three additional points along each line between every two points on given airfoil h = [0, 0.25, 0.5, 0.75].'; %// steps along each line - column vector %// every interpolated h along the way between f(x(n)) and f(x(n+1)) can %// be defined as: f(x(n) + h) = f(x(n)) + h*( f(x(n+1)) - f(x(n)) ) %// this is first order finite differences approximation in 1D. 2D is very %// similar only with gradient (this should be common knowledge, look it up) %// from here it's just fancy matrix play %// 2D gradient of xy curve gradxy = diff(xy, 1, 2); %// diff xy, first order, along the 2nd dimension, where x and y now run h_times_gradxy = bsxfun(#times, h, gradxy); %// gradient times step size xy_in_3d_array = bsxfun(#plus, xy(:,1:end-1,:), h_times_gradxy); %// addition of "f(x)" and there we have it, the new x and y for every step h [x,y] = deal(xy_in_3d_array(:,:,1), xy_in_3d_array(:,:,2)); %// extract x and y from 3d matrix xy_interp = [x(:), y(:)]; %// use Matlab's linear indexing to flatten x and y into columns %// plot to check results figure; ax = newplot; hold on; plot(ax, xy(:,:,1), xy(:,:,2),'o-'); plot(ax, xy_interp(:,1), xy_interp(:,2),'+') legend('Original','Interpolated',0); axis tight; grid; %// The End And these are the results, near x=0 for clarity of presentation: Hope that helps. Cheers.
Plot set of lines in Matlab
I have a matrix with a set points, divided in groups of 10 (example below). Each group of points corresponds to a line; how can I plot all lines? Here is an example of how the matrix is organised: y = [ 109.41 110.55 111.69 112.83 113.96 115.10 116.24 117.37 118.51 119.65 56.87 56.21 55.55 54.89 54.23 53.57 52.91 52.25 51.5 50.92 -265.16 -263.07 -260.99 -258.90 -256.81 -254.73 -252.64 -250.55 -248.47 -246.38 ]; This is the code I am using to produce the matrix and try to plot all the lines: for line = (1:n) for point = (1:10) y(line,point) = [Y(line)-point*sin(Omega(line))]; end end plot(0:1000,y,'linewidth',2)
I am not surprised you got the error you have with the code you are using. size(0:1000) is 1x1001. What size is your matrix y? With the data you have provided, I would use the following: y = [109.41 110.55 111.69 112.83 113.96 115.10 116.24 117.37 118.51 119.65; ... 56.87 56.21 55.55 54.89 54.23 53.57 52.91 52.25 51.5 50.92; ... -265.16 -263.07 -260.99 -258.90 -256.81 -254.73 -252.64 -250.55 -248.47 -246.38]; plot(0:100:900,y,'linewidth',2) % size(0:100:900) is 1x10 and size(y) is 3x10 so we're good This gives the following result (in Octave, should be exactly the same in MATLAB):
Assuming Y is of size 1-by-n, Omega is of size 1-by-n, then you can avoid the nested loop: y = bsxfun( #minus, Y, bsxfun( #times, (1:10)', sin( Omega ) ) ); %' plot( 1:n, y, 'LineWidth', 2 );
tensile tests in matlab
The problem says: Three tensile tests were carried out on an aluminum bar. In each test the strain was measured at the same values of stress. The results were where the units of strain are mm/m.Use linear regression to estimate the modulus of elasticity of the bar (modulus of elasticity = stress/strain). I used this program for this problem: function coeff = polynFit(xData,yData,m) % Returns the coefficients of the polynomial % a(1)*x^(m-1) + a(2)*x^(m-2) + ... + a(m) % that fits the data points in the least squares sense. % USAGE: coeff = polynFit(xData,yData,m) % xData = x-coordinates of data points. % yData = y-coordinates of data points. A = zeros(m); b = zeros(m,1); s = zeros(2*m-1,1); for i = 1:length(xData) temp = yData(i); for j = 1:m b(j) = b(j) + temp; temp = temp*xData(i); end temp = 1; for j = 1:2*m-1 s(j) = s(j) + temp; temp = temp*xData(i); end end for i = 1:m for j = 1:m A(i,j) = s(i+j-1); end end % Rearrange coefficients so that coefficient % of x^(m-1) is first coeff = flipdim(gaussPiv(A,b),1); The problem is solved without a program as follows MY ATTEMPT T=[34.5,69,103.5,138]; D1=[.46,.95,1.48,1.93]; D2=[.34,1.02,1.51,2.09]; D3=[.73,1.1,1.62,2.12]; Mod1=T./D1; Mod2=T./D2; Mod3=T./D3; xData=T; yData1=Mod1; yData2=Mod2; yData3=Mod3; coeff1 = polynFit(xData,yData1,2); coeff2 = polynFit(xData,yData2,2); coeff3 = polynFit(xData,yData3,2); x1=(0:.5:190); y1=coeff1(2)+coeff1(1)*x1; subplot(1,3,1); plot(x1,y1,xData,yData1,'o'); y2=coeff2(2)+coeff2(1)*x1; subplot(1,3,2); plot(x1,y2,xData,yData2,'o'); y3=coeff3(2)+coeff3(1)*x1; subplot(1,3,3); plot(x1,y3,xData,yData3,'o'); What do I have to do to get this result?
As a general advice: avoid for loops wherever possible. avoid using i and j as variable names, as they are Matlab built-in names for the imaginary unit (I really hope that disappears in a future release...) Due to m being an interpreted language, for-loops can be very slow compared to their compiled alternatives. Matlab is named MATtrix LABoratory, meaning it is highly optimized for matrix/array operations. Usually, when there is an operation that cannot be done without a loop, Matlab has a built-in function for it that runs way way faster than a for-loop in Matlab ever will. For example: computing the mean of elements in an array: mean(x). The sum of all elements in an array: sum(x). The standard deviation of elements in an array: std(x). etc. Matlab's power comes from these built-in functions. So, your problem. You have a linear regression problem. The easiest way in Matlab to solve this problem is this: %# your data stress = [ %# in Pa 34.5 69 103.5 138] * 1e6; strain = [ %# in m/m 0.46 0.95 1.48 1.93 0.34 1.02 1.51 2.09 0.73 1.10 1.62 2.12]' * 1e-3; %# make linear array for the data yy = strain(:); xx = repmat(stress(:), size(strain,2),1); %# re-formulate the problem into linear system Ax = b A = [xx ones(size(xx))]; b = yy; %# solve the linear system x = A\b; %# modulus of elasticity is coefficient %# NOTE: y-offset is relatively small and can be ignored) E = 1/x(1) What you did in the function polynFit is done by A\b, but the \-operator is capable of doing it way faster, way more robust and way more flexible than what you tried to do yourself. I'm not saying you shouldn't try to make these thing yourself (please keep on doing that, you learn a lot from it!), I'm saying that for the "real" results, always use the \-operator (and check your own results against it as well). The backslash operator (type help \ on the command prompt) is extremely useful in many situations, and I advise you learn it and learn it well. I leave you with this: here's how I would write your polynFit function: function coeff = polynFit(X,Y,m) if numel(X) ~= numel(X) error('polynFit:size_mismathc',... 'number of elements in matrices X and Y must be equal.'); end %# bad condition number, rank errors, etc. taken care of by \ coeff = bsxfun(#power, X(:), m:-1:0) \ Y(:); end I leave it up to you to figure out how this works.
fisheriris data and perceptron
i want to apply the perceptron algorithm for fisheriris data and i was tried this code function [ ] = Per( ) %PERCEPTON_NN Summary of this function goes here % Detailed explanation goes here %%%%%%%%%%%STEP ONE INPUT DATA PREPERATION %N=3000; load fisheriris tr=50; %traning te=50; %test epochs =150; data=meas; %N = size(meas,1); %species=nonomil(species) %figure,plot(data_shuffeled(1,:),data_shuffeled(2,:),'rx'); %%%%%%%%%%%%%%%%%%%STEP TWO INTIALIZE WEIGHT baise=1; w=[baise; 1 ; 1;1 ; 1]; eta=0.9; %%learning rate %%%%%%%%%%%%%%%%%%%%%%%% Rosen Blatt learning Algo for epoch=1 : epochs for i=1 : tr x=[1;data(i,1);data(i,2);data(i,3);data(i,4)]; % input vector N = size(species,i); %desiard output y=w'*x; % y=actual output ,w'= transpose w , mmoken y=w.*x %%%%%%%%%%%%%%% Activation function (hardlimit)(step fn) y=1*(y>=0)+(-1)*(y<0); % da badl el if %%%%%%%%%%% Error calcualtion %%%%%%% err(i)=N-y; %%%%%%%%%%%%%% update weight %%%%%%%%%5 wnew=w+ eta*err(i)*x; w=wnew; end mse(epoch)=mean(err.^2); end %%%%%%%%%%%%%%%%%%%%%% step four classification (testing) %%%%%%%%%%%%%%%%%%5 hold on for i=1 : te %x=[1;data(i,1);data(i,2),data(i,3);data(i,4)]; x=[1;data(i,1);data(i,2);data(i,3);data(i,4)]; % d=data_shuffeled(3,i+tr); N = size(species,i); y=w'*x; y=1*(y>=0)+(-1)*(y<0); if (y==1) plot(x(2),x(3),x(4),x(5),'rx'); elseif y==-1 plot(x(2),x(3),x(4),x(5),'r&'); end end hold off if abs(N-y)>1E-6 testerro=testerro+1; end i wrote this code to make the perceptron algorithm with fisheriris data "meas" as input and species as "output" any help in the code or any modify on this code . Thanks .
First, did you know that MATLAB has something for neural network training called the Neural network toolbox? Second, think data_shuffeled is your own function. There is something called randperm in MATLAB that you should use to shuffle your data. Third, you want to avoid using for-loops when you can use vectors/matrices in MATLAB. Instead of doing (for testing) for i = 1:te, .... end You might want to do X = [ones(te,1), data]; %X is [50x5] so each row of X is x' y = X*w; %y is [50x1], X is [50x5], w is [5x1] idx_p1 = y==1; %all the indices of y where y is +1 idx_m1 = y==-1; %all the indicies of y where y is -1 plot(X(idx_p1,1),y(idx_p1),'rx'); plot(X(idx_m1,1),y(idx_m1),'r&'); I don't know how you were using plot with 4-dimensional X so the above just plots with the first feature (column) of X. Additionally, the training looks strange to me. For one, I don't think you should use N for both the size of data matrix meas and for the desired output. 'yhat' or 'ybar' is a better name. Also, if N is the desired output, then why is it size(species,i) where i loops through 1:50? species is a [150x1] vector. size(species,1) = 150. And size(species,x) where x is 2 to 50 will be 1. Are you sure you want this? Shouldn't it be something like: yhat = -ones(50,1); %Everything is -1 yhat(strmatch('virginica,species)) = 1; %except virginicas which are +1