function intro() % An introduction to the MatLab programming, the most useful codes % % http://strijov.com % INPUT vec = [1; 2; 3] vecT = [1 2 3] mat = [1 2 3 4 5 6] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % VECTORS AND MATRICES m = 3; n = 2; mat1 = ones(m,n) mat0 = zeros(m,n) mat2 = rand(n,n) mat4 = randn(n,n) mat3 = rand(n,n,n) vec = [0:0.01:1] % make a vector vec = [0:100] vec = linspace(0,1,100) % concantenate 2 vectors vec = [0:0.5:1, 2:0.4:3] % append an element after and before vec(end) vec(end+1) = 3 vec = [-1 vec] % for row-vectors! % vectorisation, align a vector dimensions vec = mat4(:) idx = find(vec < 0.05) vec(idx) = [] vec=[] mat1 = [1:5]'*[1:5] mat2 = mat1(2:4,2:5) mat2 = mat2' mat2 = [mat1; mat1] mat2 = [mat1, mat1] % the string is a vector, too i = 2 str = ['The lucky number is ', num2str(i)] % but not vice versus str = ''; % empty string str = sprintf(' 1 plus%s %d',str,i) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % OPERATIONS % dot production x = [1:5]'; norm = x'*x table = x*x' % and matrix multiplication A = rand(5,2) ATA = A'*A ATA1 = inv(ATA) ATA1'*ATA % element-by-element operations y = 1+x y = x+x y = x.*x Y = A.*A %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % STRUCTURES PP.niter = 100; PP.tolX = 10e-6; PP.display = 1; niter = PP(1).niter; PP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % CELL ARRAYS strarray = {'one','two','et cetera'} strarray = {'north','south';'west','east'} fprintf(1, 'Go to the %s!\n', strarray{1,1}); % but, note that the following item is a cell strarray(1,1) strarray{1,1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % FOR % This is convenient to use a construction x=rand(5,1); % get some x for i=1:length(x) fprintf(1,'%1.2f\n',x(i)); % some code uses x(i) end % and the following construction, too x=rand(5,1); % get some x idx = find(x>0.5); % find some elements of x to process for i = idx % here idx is integer-valued vector fprintf(1,'%1.2f\n',x(i)); % some code uses x(i) end % its is very good to operate like that idx = [0.1, 0.5, 0.7]; % get some index values (real, why not?) for i=idx fprintf(1,'%1.2f\n',i); end % an note that no need to use additional lines if you deal with vectors mat = [1 3 5 7; 2 4 6 8] for i = mat fprintf(1,'i'' = %s\n',num2str(i')); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % IF % It is convenient to use quantifiers all and any instead of login % operations and(a,b), synonim 'a & b' and or(a,b), synonim a | b. % Therse quantifiers get vector as a argument. a = 1; b = 2; c = []; % empty d = NaN; % Non a Number e = -Inf; % Infinity if any([a>b, isempty(c), isnan(d), isinf(e)]) disp('something remarkeble happens') end % instead of if or (a>b, or( isempty(c), or( isnan(d), isinf(e)))) disp('something remarkeble happens'); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % CODING % This is obvious to write an effective code. I.e. instead of % Disjecta code 'Overdrive' x = [0:0.01*2*pi:2*pi]; % the length of the vector is 101 y = sin(x); y1 = y; CONST = 0.2; for i = 1:length(y1) if y1(i) > CONST, % please, do not act like that! y1(i) = CONST; elseif y1(i) < -CONST; y1(i) = -CONST; end end plot(x,y,'r-'); hold on plot(x,y1,'b-'); hold off % it's better to write % Disjecta code 'Overdrive' n = 100; x = linspace(0,2*pi,n); y = sin(x); idx = find(abs(y) > CONST); y(idx) = sign(y(idx))*CONST; % here the same result in a few lines of code! % It is neccessary to use embedded Matlab operations, but not construct % cumtom-made. % Disjecta code 'Multiply some matrix'es columns by some values' n = 5; x = rand(n,1); A = magic(n); for j = 1:n A(:,j) = A(:,j)*x(j); end % It's better to do % Disjecta code 'Multiply some matrix'es columns by some values' n = 5; x = rand(n,1); A = magic(n); A = A*diag(x); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % FUNCTIONS % types of functions: embedded, private, public and inline. % WARNING (after functions) % All the fictions, especially fictions of regression models and 'mapsto' % functions must get a scalar as well as a vector of a matrix to process. % So if there is a scalar is an argument, a function is a scalar, and so on % for the a vector and a matrix. % example of the warning: normalize a vector % place the code below in a separate file named 'to01.m' %function y = to01(x) % y = (x - min(x))./(max(x) - min(x)) %return % DO NOT FORGET TO REMOVE THE COMMENTS '%' WHEN PLACED %... and use this function like that x = randn(1,20); y = to01(x); min(y) max(y) % function evaluation eval('x = [1,2;3,4];') [m,n] = eval('size(x)') mat = feval('rand',2,2) % how to make an [a x b x c x d x ... x e] (k-times) k = 5; % have to generate k-dimantional array dims=randperm(k+1) % let the dimension sizes be random dims(find(dims==1)) = [] % remove the size of 1 str = sprintf('%d,',dims) % type the vector into a string str = sprintf('rand(%s);',str(1:end-1)) % add the rand function mat = eval(str); % evaluate the expression size(mat) % check the size of the obtained multi-dimensional array mat % inline functions f1 = inline('w(1) + w(2)*x','w','x'); y1 = f1([1 2],3) y1 = f1([1,2],[1:5]') % be care of this f2 = inline('(x - min(x))./(max(x) - min(x))','x'); y2 = f2([1:10]) % THAT'S THE END OF THE EXECUTABLE CODE return % One easily can vary the number of input and output arguments. function [a,b,c] = somefunc(d,e,f) if nargin < 3, f = 1; end % some code... , i.e. a = d; b = e; if nargout > 2, c = f; end return