~~NOTOC~~ ===== Matlab Help for Typical Situations in Homeworks ====== === Some recommendations for the fastest progress === - Do not trust any results unless you verified them. - Always verify your results. - Try to visualize your results. - Each Matlab command has help. E.g. for ''plot''help plot % text version doc plot % html version == Debugging == Matlab has a powerful debugger. Either put breakpoints everywhere you want, or use the command ''keyboard'' in your code to stop processing at the place. Exit the debugging mode: dbquit You can also start debugging automatically in case of error by turning on dbstop error == Saving intermediate data == Especially when some user input is needed, it is wise to store intermediate data for later reuse. Following example could be helpful if( ~exist( 'my_points.mat', 'file' ) ) [x y] = ginput( 7 ); save( 'my_points.mat', 'x', 'y' ); else load( 'my_points.mat' ); end === Vectors and its transformations === Vectors are stored as column matrices. u = [1;2]; X = [1;2;3]; Xmore = [1 2 3; 4 5 6]'; % transpose at the end Vectors are multiplied by a matrices on the left: P = [1 0 0 -5; 0 1 0 -6; 0 0 1 1]; % a camera ux_homog = P * [X;1]; % projection === Special matrices: Identity, Zeros, Ones === I = eye(3); % 3x3 identity I2 = diag( [1 1 1] ); % same result Z = zeros(3); % 3x3 matrix of zeroes O = ones(3); % 3x3 matrix of ones === Euclidean distance of two 3D points === X1 = [1;2;3]; X2 = [4;5;6]; d2 = norm(X1-X2); % cannot be used for more vectors d2 = sqrt(sum((X1-X2).^2)); % for matrices with points stored in columns === Dot (scalar) product === u1 = [4;5;1]; u2 = [7;8;1]; dot12 = u1' * u2; % apostrophe is the transpose === Element-by-element matrix operations === In addition to standard matrix addition and subtraction, there are some operators working element-by-element. M1 = [1 2; 3 4; 5 6]; M2 = [7 8; 9 10; 11 12]; % note the sizes A = M1 .* M2; % Hadamard product (multiplication element-by-element; note the dot) B = M1 ./ M2; % Hadamard division (division element-by-element) C = M1 .^ 2; % power element-by-element === Selection of the real part of complex numbers === numbers = [1 2 sqrt(-3) acos(2) 4 6+3i 7 ]; is_real = imag( numbers ) == 0; % logical array real_only = numbers( is_real ); === Cross product === u1 = [4;5;1]; u2 = [7;8;1]; u12x = cross(u1,u2); % verification of orthogonality by dot product % (remember the recommendations 1 and 2) u12x' * u1 % should be zero u12x' * u2 % should be zero === Angle given x and y coordinate. === Let x = r cos(a) and y = r sin(a). Then the angle can be recovered as a = atan2( y, x ); This function is safe when either of its arguments is zero (but not both), and works for four quadrants. === Capturing a bitmap snapshot of a figure/axis === Let ''hnd'' be some axes handle (e.g. ''gca'') or some figure handle (e.g. ''gcf''). The snapshot identical to the (pixel-wise) appearance of the screen is captured as f = getframe( hnd ); img = f.cdata; Notes: when capturing a sequence, do not forget to call ''drawnow'' before capturing. Also be careful not to obscure the captured window by other GUI content, mouse pointer, etc. === Creating a video sequence === mov = avifile( 'my_file.avi' ); mov.compression = 'none'; mov.fps = 25; % or whatever you want % now iterate creation of frames % all frames must have the same size mov = addframe( mov, img ); % end of frame creation mov = close( mov ); Note that video compression (compression different from 'none') usually does not work well, so preferred way is to store raw sequence and compress later. === To be continued ... ===