From: <par...@us...> - 2010-09-25 18:00:21
|
Revision: 7768 http://octave.svn.sourceforge.net/octave/?rev=7768&view=rev Author: paramaniac Date: 2010-09-25 18:00:14 +0000 (Sat, 25 Sep 2010) Log Message: ----------- control: replace for-loops by cellfun Modified Paths: -------------- trunk/octave-forge/main/control/inst/@ss/__freqresp__.m trunk/octave-forge/main/control/inst/@tf/__freqresp__.m trunk/octave-forge/main/control/inst/__frequency_response__.m trunk/octave-forge/main/control/inst/sigma.m Modified: trunk/octave-forge/main/control/inst/@ss/__freqresp__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__freqresp__.m 2010-09-25 16:00:26 UTC (rev 7767) +++ trunk/octave-forge/main/control/inst/@ss/__freqresp__.m 2010-09-25 18:00:14 UTC (rev 7768) @@ -20,52 +20,43 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.2 +## Version: 0.3 -function H = __freqresp__ (sys, w, resptype = 0) +function H = __freqresp__ (sys, w, resptype = 0, cellflag = false) - [p, m] = size (sys); - [A, B, C, D, E, Ts] = dssdata (sys); + [a, b, c, d, e, tsam] = dssdata (sys); - J = eye (m); + j = eye (columns (b)); if (resptype != 0 && m != p) error ("ss: freqresp: system must be square for response type %d", resptype); endif - if (Ts > 0) # discrete system - s = exp (i * w * Ts); + if (tsam > 0) # discrete system + s = num2cell (exp (i * w * tsam)); else # continuous system - s = i * w; + s = num2cell (i * w); endif - l_s = length (s); - H = zeros (p, m, l_s); - switch (resptype) case 0 # default system - for k = 1 : l_s - H(:, :, k) = C * inv (s(k)*E - A) * B + D; - endfor + H = cellfun (@(x) c/(x*e - a)*b + d, s, "uniformoutput", false); case 1 # inversed system - for k = 1 : l_s - H(:, :, k) = inv (C * inv (s(k)*E - A) * B + D); - endfor + H = cellfun (@(x) inv (c/(x*e - a)*b + d), s, "uniformoutput", false); case 2 # inversed sensitivity - for k = 1 : l_s - H(:, :, k) = J + C * inv (s(k)*E - A) * B + D; - endfor + H = cellfun (@(x) j + c/(x*e - a)*b + d, s, "uniformoutput", false); case 3 # inversed complementary sensitivity - for k = 1 : l_s - H(:, :, k) = J + inv (C * inv (s(k)*E - A) * B + D); - endfor + H = cellfun (@(x) j + inv (c/(x*e - a)*b + d), s, "uniformoutput", false); otherwise error ("ss: freqresp: invalid response type"); - endswitch + if (! cellflag) + H = cat (3, H{:}); + endif + endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tf/__freqresp__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__freqresp__.m 2010-09-25 16:00:26 UTC (rev 7767) +++ trunk/octave-forge/main/control/inst/@tf/__freqresp__.m 2010-09-25 18:00:14 UTC (rev 7768) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,60 +20,48 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 -function H = __freqresp__ (sys, w, resptype = 0) +function H = __freqresp__ (sys, w, resptype = 0, cellflag = false) - [p, m] = size (sys); - [num, den, Ts] = tfdata (sys); + [num, den, tsam] = tfdata (sys); - if (Ts > 0) # discrete system - s = exp (i * w * Ts); + if (tsam > 0) # discrete system + s = num2cell (exp (i * w * tsam)); else # continuous system - s = i * w; + s = num2cell (i * w); endif - l_s = length (s); - H = zeros (p, m, l_s); + f = @(z) cellfun (@(x, y) polyval (x, z) / polyval (y, z), num, den); - for b = 1 : p - for a = 1 : m - num_pm = num{b, a}; - den_pm = den{b, a}; + H = cellfun (f, s, "uniformoutput", false); - for k = 1 : l_s - H(b, a, k) = polyval (num_pm, s(k)) / polyval (den_pm, s(k)); - endfor - endfor - endfor - if (resptype) + [p, m] = size (sys); + if (m != p) error ("tf: freqresp: system must be square for response type %d", resptype); endif - I = eye (p); + j = eye (p); switch (resptype) case 1 # inversed system - for k = 1 : l_s - H(:, :, k) = inv (H(:, :, k)); - endfor + H = cellfun (@inv, H, "uniformoutput", false); case 2 # inversed sensitivity - for k = 1 : l_s - H(:, :, k) = I + H(:, :, k); - endfor + H = cellfun (@(x) j + x, H, "uniformoutput", false); case 3 # inversed complementary sensitivity - for k = 1 : l_s - H(:, :, k) = I + inv (H(:, :, k)); - endfor + H = cellfun (@(x) j + inv (x), H, "uniformoutput", false); otherwise error ("tf: freqresp: invalid response type"); - endswitch endif + if (! cellflag) + H = cat (3, H{:}); + endif + endfunction Modified: trunk/octave-forge/main/control/inst/__frequency_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-25 16:00:26 UTC (rev 7767) +++ trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-25 18:00:14 UTC (rev 7768) @@ -23,7 +23,7 @@ ## Created: November 2009 ## Version: 0.2 -function [H, w] = __frequency_response__ (sys, w = [], mimoflag = 0, resptype = 0, wbounds = "std") +function [H, w] = __frequency_response__ (sys, w = [], mimoflag = 0, resptype = 0, wbounds = "std", cellflag = false) ## check arguments if(! isa (sys, "lti")) @@ -44,6 +44,6 @@ endif ## frequency response - H = __freqresp__ (sys, w, resptype); + H = __freqresp__ (sys, w, resptype, cellflag); endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/sigma.m =================================================================== --- trunk/octave-forge/main/control/inst/sigma.m 2010-09-25 16:00:26 UTC (rev 7767) +++ trunk/octave-forge/main/control/inst/sigma.m 2010-09-25 18:00:14 UTC (rev 7768) @@ -57,7 +57,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: May 2009 -## Version: 0.3.1 +## Version: 0.4 function [sv_r, w_r] = sigma (sys, w = [], resptype = 0) @@ -67,17 +67,11 @@ print_usage (); endif - [H, w] = __frequency_response__ (sys, w, true, resptype, "std"); + [H, w] = __frequency_response__ (sys, w, true, resptype, "std", true); - [p, m] = size (sys); - l_w = length (w); - sv = zeros (min (m, p), l_w); # preallocate memory + sv = cellfun (@svd, H, "uniformoutput", false); + sv = horzcat (sv{:}); - ## singular value decomposition - for k = 1 : l_w - sv(:, k) = svd (H(:, :, k)); - endfor - if (! nargout) # plot the information ## convert to dB for plotting This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |