This list is closed, nobody may subscribe to it.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(10) |
Aug
(5) |
Sep
(3) |
Oct
(41) |
Nov
(41) |
Dec
(33) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(75) |
Feb
(10) |
Mar
(170) |
Apr
(174) |
May
(66) |
Jun
(11) |
Jul
(10) |
Aug
(44) |
Sep
(73) |
Oct
(28) |
Nov
(139) |
Dec
(52) |
2003 |
Jan
(35) |
Feb
(93) |
Mar
(62) |
Apr
(10) |
May
(55) |
Jun
(70) |
Jul
(37) |
Aug
(16) |
Sep
(56) |
Oct
(31) |
Nov
(57) |
Dec
(83) |
2004 |
Jan
(85) |
Feb
(67) |
Mar
(27) |
Apr
(37) |
May
(75) |
Jun
(85) |
Jul
(160) |
Aug
(68) |
Sep
(104) |
Oct
(25) |
Nov
(39) |
Dec
(23) |
2005 |
Jan
(10) |
Feb
(45) |
Mar
(43) |
Apr
(19) |
May
(108) |
Jun
(31) |
Jul
(41) |
Aug
(23) |
Sep
(65) |
Oct
(58) |
Nov
(44) |
Dec
(54) |
2006 |
Jan
(96) |
Feb
(27) |
Mar
(69) |
Apr
(59) |
May
(67) |
Jun
(35) |
Jul
(13) |
Aug
(461) |
Sep
(160) |
Oct
(399) |
Nov
(32) |
Dec
(72) |
2007 |
Jan
(316) |
Feb
(305) |
Mar
(318) |
Apr
(54) |
May
(194) |
Jun
(173) |
Jul
(282) |
Aug
(91) |
Sep
(227) |
Oct
(365) |
Nov
(168) |
Dec
(18) |
2008 |
Jan
(71) |
Feb
(111) |
Mar
(155) |
Apr
(173) |
May
(70) |
Jun
(67) |
Jul
(55) |
Aug
(83) |
Sep
(32) |
Oct
(68) |
Nov
(80) |
Dec
(29) |
2009 |
Jan
(46) |
Feb
(18) |
Mar
(95) |
Apr
(76) |
May
(140) |
Jun
(98) |
Jul
(84) |
Aug
(123) |
Sep
(94) |
Oct
(131) |
Nov
(142) |
Dec
(125) |
2010 |
Jan
(128) |
Feb
(158) |
Mar
(172) |
Apr
(134) |
May
(94) |
Jun
(84) |
Jul
(32) |
Aug
(127) |
Sep
(167) |
Oct
(109) |
Nov
(69) |
Dec
(78) |
2011 |
Jan
(39) |
Feb
(58) |
Mar
(52) |
Apr
(47) |
May
(56) |
Jun
(76) |
Jul
(55) |
Aug
(54) |
Sep
(165) |
Oct
(255) |
Nov
(328) |
Dec
(263) |
2012 |
Jan
(82) |
Feb
(147) |
Mar
(400) |
Apr
(216) |
May
(209) |
Jun
(160) |
Jul
(86) |
Aug
(141) |
Sep
(156) |
Oct
(6) |
Nov
|
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
(2) |
2016 |
Jan
|
Feb
(2) |
Mar
(2) |
Apr
(1) |
May
(1) |
Jun
(2) |
Jul
(1) |
Aug
(1) |
Sep
|
Oct
|
Nov
(1) |
Dec
|
2019 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2021 |
Jan
|
Feb
|
Mar
|
Apr
(3) |
May
(4) |
Jun
(8) |
Jul
(2) |
Aug
(5) |
Sep
(9) |
Oct
|
Nov
|
Dec
|
From: <lm...@us...> - 2012-10-03 00:38:33
|
Revision: 11098 http://octave.svn.sourceforge.net/octave/?rev=11098&view=rev Author: lmarkov Date: 2012-10-03 00:38:27 +0000 (Wed, 03 Oct 2012) Log Message: ----------- M fuzzy-logic-toolkit/DESCRIPTION M fuzzy-logic-toolkit/ChangeLog M fuzzy-logic-toolkit/NEWS Modified Paths: -------------- trunk/octave-forge/main/fuzzy-logic-toolkit/ChangeLog trunk/octave-forge/main/fuzzy-logic-toolkit/DESCRIPTION trunk/octave-forge/main/fuzzy-logic-toolkit/NEWS Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/ChangeLog =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/ChangeLog 2012-10-03 00:38:09 UTC (rev 11097) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/ChangeLog 2012-10-03 00:38:27 UTC (rev 11098) @@ -1,3 +1,39 @@ +2012-10-02 L. Markowsky <lm...@us...> + + * Version 0.4.2 released. + * ChangeLog: Updated file. + * DESCRIPTION: Updated file. + * NEWS: Updated file. + * inst/*.m: Some trivial changes to line length and comments. + * inst/fcm.m: Edited to reflect the five renamed private functions. + Edited the demos to calculate and print the three cluster validity + indices. Edited comment. + * inst/gustafson_kessel.m: Edited to reflect the five renamed private + functions. Edited the demos to calculate and print the three + cluster validity indices. Edited comment. + * inst/partition_coeff.m: Demos were merged with the demos in fcm.m + and gustafson_kessel.m and then removed. Edited comment. + * inst/partition_entropy.m: Demos were merged with the demos in fcm.m + and gustafson_kessel.m and then removed. Edited comment. + * inst/xie_beni_index.m: Demos were merged with the demos in fcm.m + and gustafson_kessel.m and then removed. Edited comment. + * inst/private/evalmf_private.m: Edited comment. + * inst/private/is_builtin_language.m: Edited comment. + * inst/private/fcm_compute_convergence_criterion.m: Edited and renamed + compute_cluster_convergence.m. + * inst/private/fcm_compute_objective_fcn.m: Edited and renamed + compute_cluster_obj_fcn.m. + * inst/private/fcm_init_prototype.m: Edited and renamed + init_cluster_prototypes.m. + * inst/private/fcm_update_cluster_centers.m: Edited and renamed + update_cluster_prototypes.m. + * inst/private/fcm_update_membership_fcn.m: Edited and renamed + update_cluster_membership.m. + * inst/private/probor.m: Removed unused private function. + * Demos tested under: Fedora 17/Octave 3.6.2 + * Demos tested under: Fedora 16/Octave 3.4.3 + * Demos tested under: Windows 7/Octave 3.2.4 + 2012-08-26 L. Markowsky <lm...@us...> * Version 0.4.1 released. @@ -2,3 +38,4 @@ * ChangeLog: Updated file. - * COPYING: Replaced GPLv2 with GPLv3 (to fix inconsistency with source files). + * COPYING: Replaced GPLv2 with GPLv3 (to fix inconsistency with source + files). * DESCRIPTION: Updated file. @@ -11,11 +48,13 @@ * inst/fcm_demo_1.m: Removed script file. * inst/fcm_demo_2.m: Removed script file. * inst/gustafson_kessel.m: Rewrote and embedded the demos previously - contained in gustafson_kessel_demo_1.m and gustafson_kessel_demo_2.m. + contained in gustafson_kessel_demo_1.m and + gustafson_kessel_demo_2.m. * inst/gustafson_kessel_demo_1.m: Removed script file. * inst/gustafson_kessel_demo_2.m: Removed script file. * inst/*.m: Many trivial changes to line length and copyright notices. - * inst/private/*.m: Many trivial changes to line length and copyright notice. + * inst/private/*.m: Many trivial changes to line length and copyright + notice. * All demos tested under: Fedora 17/Octave 3.6.2 2012-07-10 L. Markowsky <lm...@us...> @@ -25,17 +64,20 @@ * DESCRIPTION: Updated file. * INDEX: Updated file. * NEWS: New file. - * inst/fcm.m: New file. Addition of the Fuzzy C-Means clustering algorithm - to the toolkit. + * inst/fcm.m: New file. Addition of the Fuzzy C-Means clustering + algorithm to the toolkit. * inst/fcm_demo_1.m: New file. Addition of demo script. * inst/fcm_demo_2.m: New file. Addition of demo script. * inst/gustafson_kessel.m: New file. Addition of the Gustafson-Kessel clustering algorithm to the toolkit. * inst/gustafson_kessel_demo_1.m: New file. Addition of demo script. * inst/gustafson_kessel_demo_2.m: New file. Addition of demo script. - * inst/partition_coeff.m: New file. Addition of a measure of cluster validity. - * inst/partition_entropy.m: New file. Addition of a measure of cluster validity. - * inst/xie_beni_index.m: New file. Addition of a measure of cluster validity. + * inst/partition_coeff.m: New file. Addition of a measure of cluster + validity. + * inst/partition_entropy.m: New file. Addition of a measure of cluster + validity. + * inst/xie_beni_index.m: New file. Addition of a measure of cluster + validity. * inst/private/fcm_compute_convergence_criterion.m: New file. * inst/private/fcm_compute_objective_fcn.m: New file. * inst/private/fcm_init_prototype.m: New file. @@ -49,7 +91,8 @@ * Version 0.3.0 released. * ChangeLog: Updated file. * DESCRIPTION: Updated file. - * inst/*.m: Many trivial changes to comments and spacing in parameter lists. + * inst/*.m: Many trivial changes to comments and spacing in parameter + lists. * inst/addrule.m: Edited comment to describe use with hedges. * inst/algebraic_product.m: New file. * inst/algebraic_sum.m: New file. @@ -69,20 +112,22 @@ * inst/heart_disease_demo_2.m : Renamed heart_demo_2.m. * inst/investment_portfolio.fis: New file. * inst/investment_portfolio_demo.m: New file. - * inst/plotmf.m: Edited to add support for linear output membership functions - and to support optional y-limit arguments. + * inst/plotmf.m: Edited to add support for linear output membership + functions and to support optional y-limit arguments. * inst/readfis.m: Edited to add custom and built-in hedge support. * inst/showrule.m: Edited to add Chinese, Russian, and Spanish to the - built-in languages and to add custom language support. Also edited to add - custom hedge support and to implement the hedges "somewhat", "very", - "extremely", and "very very". + built-in languages and to add custom language support. Also edited + to add custom hedge support and to implement the hedges + "somewhat", "very", "extremely", and "very very". * inst/sugeno_tip_calculator.fis: Edited to demonstrate hedges. * inst/sugeno_tip_demo.m: Edited to demonstrate hedges. * inst/writefis.m: Edited comment to note that zenity is required by the GUI. Code edited to support hedges. - * inst/private/*.m: Many trivial changes to spacing in parameter lists. - * inst/private/aggregate_output_mamdani.m: Edited to support new built-in - T-norm/S-norm pairs when used as the FIS aggregation method. + * inst/private/*.m: Many trivial changes to spacing in parameter + lists. + * inst/private/aggregate_output_mamdani.m: Edited to support new + built-in T-norm/S-norm pairs when used as the FIS aggregation + method. * inst/private/eval_firing_strength.m: Edited to support new built-in T-norm/S-norm pairs when used as the FIS 'and' or 'or' method. * inst/private/evalmf_private.m: Edited to evaluate linear membership @@ -91,15 +136,16 @@ hedge support. * inst/private/eval_rules_sugeno.m: Edited to add custom and built-in hedge support. - * inst/private/fuzzify_input.m: Edited to add custom and built-in hedge + * inst/private/fuzzify_input.m: Edited to add custom and built-in + hedge support. + * inst/private/get_mf_index_and_hedge.m: New file to add hedge support. - * inst/private/get_mf_index_and_hedge.m: New file to add hedge support. * inst/private/is_real.m: Improved test. * inst/private/is_real_matrix.m: Improved test. - * inst/private/is_builtin_language.m: Renamed is_language.m. Edited test to - add 'chinese', 'mandarin', 'pinyin', 'russian', 'pycckii', 'russkij', - 'spanish', 'french', and 'german' to the strings specifying built-in - languages. + * inst/private/is_builtin_language.m: Renamed is_language.m. Edited + test to add 'chinese', 'mandarin', 'pinyin', 'russian', 'pycckii', + 'russkij', 'spanish', 'french', and 'german' to the strings + specifying built-in languages. * Demos tested under: Fedora 15/Octave 3.4.2 * Demos tested under: Windows 7/Octave 3.2.4 @@ -157,7 +203,8 @@ * DESCRIPTION: Updated file. * INDEX: Updated file. * inst/*.m: Edited numerous comments and texinfo comment blocks. - * inst/private/*.m: Edited numerous comments and texinfo comment blocks. + * inst/private/*.m: Edited numerous comments and texinfo comment + blocks. * inst/cubic_approx_demo.m: New file. * inst/cubic-approximator.fis: New file. * inst/linear-tip-calculator.fis: New file. Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/DESCRIPTION =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/DESCRIPTION 2012-10-03 00:38:09 UTC (rev 11097) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/DESCRIPTION 2012-10-03 00:38:27 UTC (rev 11098) @@ -1,6 +1,6 @@ Name: fuzzy-logic-toolkit -Version: 0.4.1 -Date: 2012-08-26 +Version: 0.4.2 +Date: 2012-10-02 Author: L. Markowsky <lm...@us...> Maintainer: L. Markowsky <lm...@us...> Title: Octave Fuzzy Logic Toolkit Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/NEWS =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/NEWS 2012-10-03 00:38:09 UTC (rev 11097) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/NEWS 2012-10-03 00:38:27 UTC (rev 11098) @@ -1,3 +1,10 @@ +Summary of important user-visible changes for fuzzy-logic-toolkit 0.4.2: +------------------------------------------------------------------------ + + ** The demos embedded in partition_coeff.m, partition_entropy.m, + and xie_beni_index.m were merged with the embedded demos in + fcm.m and gustafson_kessel.m. + Summary of important user-visible changes for fuzzy-logic-toolkit 0.4.1: ------------------------------------------------------------------------ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lm...@us...> - 2012-10-03 00:38:17
|
Revision: 11097 http://octave.svn.sourceforge.net/octave/?rev=11097&view=rev Author: lmarkov Date: 2012-10-03 00:38:09 +0000 (Wed, 03 Oct 2012) Log Message: ----------- M inst/hamacher_product.m M inst/partition_coeff.m M inst/heart_disease_risk.fis M inst/einstein_product.m M inst/mamdani_tip_calculator.fis M inst/sugeno_tip_demo.m M inst/cubic_approx_demo.m M inst/drastic_product.m M inst/linear_tip_demo.m M inst/hamacher_sum.m M inst/rmmf.m M inst/einstein_sum.m M inst/fcm.m M inst/xie_beni_index.m M inst/sugeno_tip_calculator.fis M inst/drastic_sum.m M inst/investment_portfolio.fis M inst/gustafson_kessel.m M inst/cubic_approximator.fis M inst/linear_tip_calculator.fis M inst/heart_disease_demo_1.m M inst/heart_disease_demo_2.m M inst/partition_entropy.m Modified Paths: -------------- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/cubic_approx_demo.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/cubic_approximator.fis trunk/octave-forge/main/fuzzy-logic-toolkit/inst/drastic_product.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/drastic_sum.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/einstein_product.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/einstein_sum.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/fcm.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/gustafson_kessel.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/hamacher_product.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/hamacher_sum.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_demo_1.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_demo_2.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_risk.fis trunk/octave-forge/main/fuzzy-logic-toolkit/inst/investment_portfolio.fis trunk/octave-forge/main/fuzzy-logic-toolkit/inst/linear_tip_calculator.fis trunk/octave-forge/main/fuzzy-logic-toolkit/inst/linear_tip_demo.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/mamdani_tip_calculator.fis trunk/octave-forge/main/fuzzy-logic-toolkit/inst/partition_coeff.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/partition_entropy.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/rmmf.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/sugeno_tip_calculator.fis trunk/octave-forge/main/fuzzy-logic-toolkit/inst/sugeno_tip_demo.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/xie_beni_index.m Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/cubic_approx_demo.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/cubic_approx_demo.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/cubic_approx_demo.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -41,7 +41,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy tests demos ## Directory: fuzzy-logic-toolkit/inst ## Filename: cubic_approx_demo.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 ## Read the FIS structure from a file. fis = readfis ('cubic_approximator.fis'); Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/cubic_approximator.fis =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/cubic_approximator.fis 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/cubic_approximator.fis 2012-10-03 00:38:09 UTC (rev 11097) @@ -1,3 +1,27 @@ +## Copyright (C) 2011-2012 L. Markowsky <lm...@us...> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: cubic_approximator.fis +## Last-Modified: 28 Aug 2012 + [System] Name='Cubic-Approximator' Type='sugeno' Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/drastic_product.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/drastic_product.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/drastic_product.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -44,7 +44,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy drastic_product ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: drastic_product.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 function retval = drastic_product (x, y = 0) if (nargin == 0 || nargin > 2 || Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/drastic_sum.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/drastic_sum.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/drastic_sum.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -44,7 +44,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy drastic_sum ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: drastic_sum.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 function retval = drastic_sum (x, y = 0) if (nargin == 0 || nargin > 2 || Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/einstein_product.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/einstein_product.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/einstein_product.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -39,7 +39,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy einstein_product ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: einstein_product.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 function retval = einstein_product (x, y = 0) if (nargin == 0 || nargin > 2 || Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/einstein_sum.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/einstein_sum.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/einstein_sum.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -38,7 +38,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy einstein_sum ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: einstein_sum.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 function retval = einstein_sum (x, y = 0) if (nargin == 0 || nargin > 2 || Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/fcm.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/fcm.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/fcm.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -25,10 +25,12 @@ ## @deftypefnx {Function File} {[@var{cluster_centers}, @var{soft_partition}, @var{obj_fcn_history}] =} fcm (@var{input_data}, @var{num_clusters}, [@var{m}, @var{max_iterations}, @var{epsilon}, @var{display_intermediate_results}]) ## ## Using the Fuzzy C-Means algorithm, calculate and return the soft partition -## of a set of unlabeled data points. +## of a set of unlabeled data points. ## ## Also, if @var{display_intermediate_results} is true, display intermediate -## results after each iteration. +## results after each iteration. Note that because the initial cluster +## prototypes are randomly selected locations in the ranges determined by the +## input data, the results of this function are nondeterministic. ## ## The required arguments to fcm are: ## @itemize @w @@ -111,10 +113,10 @@ ## @end deftypefn ## Author: L. Markowsky -## Keywords: fuzzy-logic-toolkit fuzzy partition clustering fcm +## Keywords: fuzzy-logic-toolkit fuzzy partition clustering ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: fcm.m -## Last-Modified: 26 Aug 2012 +## Last-Modified: 5 Sep 2012 function [cluster_centers, soft_partition, obj_fcn_history] = ... fcm (input_data, num_clusters, options = [2.0, 100, 1e-5, 1]) @@ -175,8 +177,8 @@ fcm_private (X, k, m, max_iterations, epsilon, ... display_intermediate_results) - ## Initialize the prototype and the calculation. - V = fcm_init_prototype (X, k); + ## Initialize the prototypes and the calculation. + V = init_cluster_prototypes (X, k); obj_fcn_history = zeros (max_iterations); convergence_criterion = epsilon + 1; iteration = 0; @@ -191,18 +193,18 @@ while (convergence_criterion > epsilon && ... ++iteration <= max_iterations) V_previous = V; - Mu = fcm_update_membership_fcn (V, X, m, k, n, sqr_dist); + Mu = update_cluster_membership (V, X, m, k, n, sqr_dist); Mu_m = Mu .^ m; - V = fcm_update_cluster_centers (Mu_m, X, k); + V = update_cluster_prototypes (Mu_m, X, k); sqr_dist = square_distance_matrix (X, V); obj_fcn_history(iteration) = ... - fcm_compute_objective_fcn (Mu_m, sqr_dist); + compute_cluster_obj_fcn (Mu_m, sqr_dist); if (display_intermediate_results) printf ("Iteration count = %d, Objective fcn = %8.6f\n", ... iteration, obj_fcn_history(iteration)); endif convergence_criterion = ... - fcm_compute_convergence_criterion (V, V_previous); + compute_cluster_convergence (V, V_previous); endwhile ## Remove extraneous entries from the tail of the objective @@ -219,15 +221,18 @@ %!demo %! ## This demo: -%! ## - classifies a small set of unlabeled data points using the -%! ## Fuzzy C-Means algorithm into two fuzzy clusters +%! ## - classifies a small set of unlabeled data points using +%! ## the Fuzzy C-Means algorithm into two fuzzy clusters %! ## - plots the input points together with the cluster centers +%! ## - evaluates the quality of the resulting clusters using +%! ## three validity measures: the partition coefficient, the +%! ## partition entropy, and the Xie-Beni validity index %! ## %! ## Note: The input_data is taken from Chapter 13, Example 17 in %! ## Fuzzy Logic: Intelligence, Control and Information, by %! ## J. Yen and R. Langari, Prentice Hall, 1999, page 381 %! ## (International Edition). -%! +%! %! ## Use fcm to classify the input_data. %! input_data = [2 12; 4 9; 7 13; 11 5; 12 7; 14 4]; %! number_of_clusters = 2; @@ -241,14 +246,14 @@ %! 'marker', 'x', 'color', 'b'); %! hold on; %! endfor -%! +%! %! ## Plot the cluster centers as larger red *'s. %! for i = 1 : number_of_clusters %! plot (cluster_centers(i, 1), cluster_centers(i, 2), ... %! 'LineWidth', 4, 'marker', '*', 'color', 'r'); %! hold on; %! endfor -%! +%! %! ## Make the figure look a little better: %! ## - scale and label the axes %! ## - show gridlines @@ -258,6 +263,15 @@ %! ylabel ('Feature 2'); %! grid %! hold +%! +%! ## Calculate and print the three validity measures. +%! printf ("Partition Coefficient: %f\n", ... +%! partition_coeff (soft_partition)); +%! printf ("Partition Entropy (with a = 2): %f\n", ... +%! partition_entropy (soft_partition, 2)); +%! printf ("Xie-Beni Index: %f\n\n", ... +%! xie_beni_index (input_data, cluster_centers, ... +%! soft_partition)); ##---------------------------------------------------------------------- ## FCM Demo #2 @@ -265,19 +279,23 @@ %!demo %! ## This demo: -%! ## - classifies three-dimensional unlabeled data points using the -%! ## Fuzzy C-Means algorithm into three fuzzy clusters +%! ## - classifies three-dimensional unlabeled data points using +%! ## the Fuzzy C-Means algorithm into three fuzzy clusters %! ## - plots the input points together with the cluster centers +%! ## - evaluates the quality of the resulting clusters using +%! ## three validity measures: the partition coefficient, the +%! ## partition entropy, and the Xie-Beni validity index %! ## %! ## Note: The input_data was selected to form three areas of %! ## different shapes. %! %! ## Use fcm to classify the input_data. -%! input_data = [1 11 5; 1 12 6; 1 13 5; 2 11 7; 2 12 6; 2 13 7; 3 11 6; -%! 3 12 5; 3 13 7; 1 1 10; 1 3 9; 2 2 11; 3 1 9; 3 3 10; -%! 3 5 11; 4 4 9; 4 6 8; 5 5 8; 5 7 9; 6 6 10; 9 10 12; -%! 9 12 13; 9 13 14; 10 9 13; 10 13 12; 11 10 14; -%! 11 12 13; 12 6 12; 12 7 15; 12 9 15; 14 6 14; 14 8 13]; +%! input_data = [1 11 5; 1 12 6; 1 13 5; 2 11 7; 2 12 6; 2 13 7; +%! 3 11 6; 3 12 5; 3 13 7; 1 1 10; 1 3 9; 2 2 11; +%! 3 1 9; 3 3 10; 3 5 11; 4 4 9; 4 6 8; 5 5 8; 5 7 9; +%! 6 6 10; 9 10 12; 9 12 13; 9 13 14; 10 9 13; 10 13 12; +%! 11 10 14; 11 12 13; 12 6 12; 12 7 15; 12 9 15; +%! 14 6 14; 14 8 13]; %! number_of_clusters = 3; %! [cluster_centers, soft_partition, obj_fcn_history] = ... %! fcm (input_data, number_of_clusters, [NaN NaN NaN 0]) @@ -291,8 +309,8 @@ %! hold on; %! endfor %! -%! ## Plot the cluster centers in two dimensions (using features 1 & 2) -%! ## as larger red *'s. +%! ## Plot the cluster centers in two dimensions +%! ## (using features 1 & 2) as larger red *'s. %! for i = 1 : number_of_clusters %! plot (cluster_centers(i, 1), cluster_centers(i, 2), ... %! 'LineWidth', 4, 'marker', '*', 'color', 'r'); @@ -309,8 +327,8 @@ %! grid %! hold %! -%! ## Plot the data points in two dimensions (using features 1 & 3) -%! ## as small blue x's. +%! ## Plot the data points in two dimensions +%! ## (using features 1 & 3) as small blue x's. %! figure ('NumberTitle', 'off', 'Name', 'FCM Demo 2'); %! for i = 1 : rows (input_data) %! plot (input_data(i, 1), input_data(i, 3), 'LineWidth', 2, ... @@ -318,8 +336,8 @@ %! hold on; %! endfor %! -%! ## Plot the cluster centers in two dimensions (using features 1 & 3) -%! ## as larger red *'s. +%! ## Plot the cluster centers in two dimensions +%! ## (using features 1 & 3) as larger red *'s. %! for i = 1 : number_of_clusters %! plot (cluster_centers(i, 1), cluster_centers(i, 3), ... %! 'LineWidth', 4, 'marker', '*', 'color', 'r'); @@ -335,3 +353,12 @@ %! ylabel ('Feature 3'); %! grid %! hold +%! +%! ## Calculate and print the three validity measures. +%! printf ("Partition Coefficient: %f\n", ... +%! partition_coeff (soft_partition)); +%! printf ("Partition Entropy (with a = 2): %f\n", ... +%! partition_entropy (soft_partition, 2)); +%! printf ("Xie-Beni Index: %f\n\n", ... +%! xie_beni_index (input_data, cluster_centers, ... +%! soft_partition)); Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/gustafson_kessel.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/gustafson_kessel.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/gustafson_kessel.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -27,10 +27,12 @@ ## @deftypefnx {Function File} {[@var{cluster_centers}, @var{soft_partition}, @var{obj_fcn_history}] =} gustafson_kessel (@var{input_data}, @var{num_clusters}, @var{cluster_volume}, [@var{m}, @var{max_iterations}, @var{epsilon}, @var{display_intermediate_results}]) ## ## Using the Gustafson-Kessel algorithm, calculate and return the soft partition -## of a set of unlabeled data points. +## of a set of unlabeled data points. ## ## Also, if @var{display_intermediate_results} is true, display intermediate -## results after each iteration. +## results after each iteration. Note that because the initial cluster +## prototypes are randomly selected locations in the ranges determined by the +## input data, the results of this function are nondeterministic. ## ## The required arguments to gustafson_kessel are: ## @itemize @w @@ -119,7 +121,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy partition clustering ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: gustafson_kessel.m -## Last-Modified: 26 Aug 2012 +## Last-Modified: 5 Sep 2012 function [cluster_centers, soft_partition, obj_fcn_history] = ... gustafson_kessel (input_data, num_clusters, ... @@ -194,8 +196,8 @@ gustafson_kessel_private (X, k, cluster_volume, m, max_iterations, ... epsilon, display_intermediate_results) - ## Initialize the prototype and the calculation. - V = fcm_init_prototype (X, k); + ## Initialize the prototypes and the calculation. + V = init_cluster_prototypes (X, k); obj_fcn_history = zeros (max_iterations); convergence_criterion = epsilon + 1; iteration = 0; @@ -210,18 +212,18 @@ while (convergence_criterion > epsilon && ... ++iteration <= max_iterations) V_previous = V; - Mu = fcm_update_membership_fcn (V, X, m, k, n, sqr_dist); + Mu = update_cluster_membership (V, X, m, k, n, sqr_dist); Mu_m = Mu .^ m; - V = fcm_update_cluster_centers (Mu_m, X, k); + V = update_cluster_prototypes (Mu_m, X, k); sqr_dist = gk_square_distance_matrix (X, V, Mu_m, cluster_volume); obj_fcn_history(iteration) = ... - fcm_compute_objective_fcn (Mu_m, sqr_dist); + compute_cluster_obj_fcn (Mu_m, sqr_dist); if (display_intermediate_results) printf ("Iteration count = %d, Objective fcn = %8.6f\n", ... iteration, obj_fcn_history(iteration)); endif convergence_criterion = ... - fcm_compute_convergence_criterion (V, V_previous); + compute_cluster_convergence (V, V_previous); endwhile ## Remove extraneous entries from the tail of the objective ... @@ -289,9 +291,12 @@ %!demo %! ## This demo: -%! ## - classifies a small set of unlabeled data points using the -%! ## Gustafson-Kessel algorithm into two fuzzy clusters +%! ## - classifies a small set of unlabeled data points using +%! ## the Gustafson-Kessel algorithm into two fuzzy clusters %! ## - plots the input points together with the cluster centers +%! ## - evaluates the quality of the resulting clusters using +%! ## three validity measures: the partition coefficient, the +%! ## partition entropy, and the Xie-Beni validity index %! ## %! ## Note: The input_data is taken from Chapter 13, Example 17 in %! ## Fuzzy Logic: Intelligence, Control and Information, by @@ -314,8 +319,8 @@ %! %! ## Plot the cluster centers as larger red *'s. %! for i = 1 : number_of_clusters -%! plot (cluster_centers(i, 1), cluster_centers(i, 2), 'LineWidth', ... -%! 4, 'marker', '*', 'color', 'r'); +%! plot (cluster_centers(i, 1), cluster_centers(i, 2), ... +%! 'LineWidth', 4, 'marker', '*', 'color', 'r'); %! hold on; %! endfor %! @@ -328,26 +333,39 @@ %! ylabel ('Feature 2'); %! grid %! hold - +%! +%! ## Calculate and print the three validity measures. +%! printf ("Partition Coefficient: %f\n", ... +%! partition_coeff (soft_partition)); +%! printf ("Partition Entropy (with a = 2): %f\n", ... +%! partition_entropy (soft_partition, 2)); +%! printf ("Xie-Beni Index: %f\n\n", ... +%! xie_beni_index (input_data, cluster_centers, ... +%! soft_partition)); + ##---------------------------------------------------------------------- ## Gustafson-Kessel Demo #2 ##---------------------------------------------------------------------- %!demo %! ## This demo: -%! ## - classifies three-dimensional unlabeled data points using the -%! ## Gustafson-Kessel algorithm into three fuzzy clusters +%! ## - classifies three-dimensional unlabeled data points using +%! ## the Gustafson-Kessel algorithm into three fuzzy clusters %! ## - plots the input points together with the cluster centers +%! ## - evaluates the quality of the resulting clusters using +%! ## three validity measures: the partition coefficient, the +%! ## partition entropy, and the Xie-Beni validity index %! ## %! ## Note: The input_data was selected to form three areas of %! ## different shapes. %! %! ## Use gustafson_kessel to classify the input_data. -%! input_data = [1 11 5; 1 12 6; 1 13 5; 2 11 7; 2 12 6; 2 13 7; 3 11 6; -%! 3 12 5; 3 13 7; 1 1 10; 1 3 9; 2 2 11; 3 1 9; 3 3 10; -%! 3 5 11; 4 4 9; 4 6 8; 5 5 8; 5 7 9; 6 6 10; 9 10 12; -%! 9 12 13; 9 13 14; 10 9 13; 10 13 12; 11 10 14; -%! 11 12 13; 12 6 12; 12 7 15; 12 9 15; 14 6 14; 14 8 13]; +%! input_data = [1 11 5; 1 12 6; 1 13 5; 2 11 7; 2 12 6; 2 13 7; +%! 3 11 6; 3 12 5; 3 13 7; 1 1 10; 1 3 9; 2 2 11; +%! 3 1 9; 3 3 10; 3 5 11; 4 4 9; 4 6 8; 5 5 8; 5 7 9; +%! 6 6 10; 9 10 12; 9 12 13; 9 13 14; 10 9 13; 10 13 12; +%! 11 10 14; 11 12 13; 12 6 12; 12 7 15; 12 9 15; +%! 14 6 14; 14 8 13]; %! number_of_clusters = 3; %! [cluster_centers, soft_partition, obj_fcn_history] = ... %! gustafson_kessel (input_data, number_of_clusters, [1 1 1], ... @@ -362,11 +380,11 @@ %! hold on; %! endfor %! -%! ## Plot the cluster centers in two dimensions (using features 1 & 2) -%! ## as larger red *'s. +%! ## Plot the cluster centers in two dimensions +%! ## (using features 1 & 2) as larger red *'s. %! for i = 1 : number_of_clusters -%! plot (cluster_centers(i, 1), cluster_centers(i, 2), 'LineWidth', ... -%! 4, 'marker', '*', 'color', 'r'); +%! plot (cluster_centers(i, 1), cluster_centers(i, 2), ... +%! 'LineWidth', 4, 'marker', '*', 'color', 'r'); %! hold on; %! endfor %! @@ -379,8 +397,8 @@ %! ylabel ('Feature 2'); %! grid %! -%! ## Plot the data points in two dimensions (using features 1 & 3) -%! ## as small blue x's. +%! ## Plot the data points in two dimensions +%! ## (using features 1 & 3) as small blue x's. %! figure ('NumberTitle', 'off', 'Name', 'Gustafson-Kessel Demo 2'); %! for i = 1 : rows (input_data) %! plot (input_data(i, 1), input_data(i, 3), 'LineWidth', 2, ... @@ -388,11 +406,11 @@ %! hold on; %! endfor %! -%! ## Plot the cluster centers in two dimensions (using features 1 & 3) -%! ## as larger red *'s. +%! ## Plot the cluster centers in two dimensions +%! ## (using features 1 & 3) as larger red *'s. %! for i = 1 : number_of_clusters -%! plot (cluster_centers(i, 1), cluster_centers(i, 3), 'LineWidth', ... -%! 4, 'marker', '*', 'color', 'r'); +%! plot (cluster_centers(i, 1), cluster_centers(i, 3), ... +%! 'LineWidth', 4, 'marker', '*', 'color', 'r'); %! hold on; %! endfor %! @@ -405,3 +423,12 @@ %! ylabel ('Feature 3'); %! grid %! hold +%! +%! ## Calculate and print the three validity measures. +%! printf ("Partition Coefficient: %f\n", ... +%! partition_coeff (soft_partition)); +%! printf ("Partition Entropy (with a = 2): %f\n", ... +%! partition_entropy (soft_partition, 2)); +%! printf ("Xie-Beni Index: %f\n\n", ... +%! xie_beni_index (input_data, cluster_centers, ... +%! soft_partition)); Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/hamacher_product.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/hamacher_product.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/hamacher_product.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -39,7 +39,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy hamacher_product ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: hamacher_product.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 function retval = hamacher_product (x, y = 0) if (nargin == 0 || nargin > 2 || Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/hamacher_sum.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/hamacher_sum.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/hamacher_sum.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -39,7 +39,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy hamacher_sum ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: hamacher_sum.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 function retval = hamacher_sum (x, y = 0) if (nargin == 0 || nargin > 2 || Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_demo_1.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_demo_1.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_demo_1.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -47,7 +47,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy tests demos ## Directory: fuzzy-logic-toolkit/inst ## Filename: heart_disease_demo_1.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 ## Create new FIS. a = newfis ('Heart-Disease-Risk', 'sugeno', ... Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_demo_2.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_demo_2.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_demo_2.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -45,7 +45,7 @@ ## Dr. Bruce Segee (University of Maine Dept. of ECE). ## Directory: fuzzy-logic-toolkit/inst ## Filename: heart_disease_demo_2.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 ## Read the FIS structure from a file. ## (Alternatively, to select heart_disease_risk.fis using the dialog, Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_risk.fis =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_risk.fis 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/heart_disease_risk.fis 2012-10-03 00:38:09 UTC (rev 11097) @@ -1,5 +1,29 @@ -# Heart Disease Risk FIS +## Copyright (C) 2011-2012 L. Markowsky <lm...@us...> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: heart_disease_risk.fis +## Last-Modified: 28 Aug 2012 + +## Heart Disease Risk FIS + [System] Name = 'Heart-Disease-Risk' Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/investment_portfolio.fis =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/investment_portfolio.fis 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/investment_portfolio.fis 2012-10-03 00:38:09 UTC (rev 11097) @@ -1,3 +1,27 @@ +## Copyright (C) 2011-2012 L. Markowsky <lm...@us...> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: investment_portfolio.fis +## Last-Modified: 28 Aug 2012 + [System] Name='Investment-Portfolio' Type='mamdani' Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/linear_tip_calculator.fis =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/linear_tip_calculator.fis 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/linear_tip_calculator.fis 2012-10-03 00:38:09 UTC (rev 11097) @@ -1,3 +1,27 @@ +## Copyright (C) 2011-2012 L. Markowsky <lm...@us...> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: linear_tip_calculator.fis +## Last-Modified: 28 Aug 2012 + [System] Name='Linear-Tip-Calculator' Type='sugeno' Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/linear_tip_demo.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/linear_tip_demo.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/linear_tip_demo.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -43,7 +43,7 @@ ## Dr. Bruce Segee (University of Maine Dept. of ECE). ## Directory: fuzzy-logic-toolkit/inst ## Filename: linear_tip_demo.m -## Last-Modified: 12 Nov 2011 +## Last-Modified: 20 Aug 2012 ## Read the FIS structure from a file. fis = readfis ('linear_tip_calculator.fis'); Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/mamdani_tip_calculator.fis =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/mamdani_tip_calculator.fis 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/mamdani_tip_calculator.fis 2012-10-03 00:38:09 UTC (rev 11097) @@ -1,3 +1,27 @@ +## Copyright (C) 2011-2012 L. Markowsky <lm...@us...> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: mamdani_tip_calculator.fis +## Last-Modified: 28 Aug 2012 + [System] Name='Mamdani-Tip-Calculator' Type='mamdani' Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/partition_coeff.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/partition_coeff.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/partition_coeff.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -33,6 +33,12 @@ ## @var{vpc} - the partition coefficient for the given soft partition ## @end itemize ## +## For demos of this function, please type: +## @example +## demo 'fcm' +## demo 'gustafson_kessel' +## @end example +## ## For more information about the @var{soft_partition} matrix, please see the ## documentation for function fcm. ## @@ -44,7 +50,7 @@ ## Keywords: fuzzy-logic-toolkit partition coefficient cluster ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: partition_coeff.m -## Last-Modified: 26 Aug 2012 +## Last-Modified: 4 Sep 2012 ##---------------------------------------------------------------------- ## Note: This function is an implementation of Equation 13.9 (corrected @@ -78,77 +84,3 @@ vpc = (sum (sum (soft_part_sqr))) / columns (soft_partition); endfunction - -##---------------------------------------------------------------------- -## Partition Coefficient Demo #1 -##---------------------------------------------------------------------- - -%!demo -%! ## Use the Fuzzy C-Means and Gustafson-Kessel algorithms to classify -%! ## a small set of unlabeled data points and evaluate the quality -%! ## of the resulting clusters. -%! -%! ## Note: The input_data is taken from Chapter 13, Example 17 in -%! ## Fuzzy Logic: Intelligence, Control and Information, by -%! ## J. Yen and R. Langari, Prentice Hall, 1999, page 381 -%! ## (International Edition). -%! -%! input_data = [2 12; 4 9; 7 13; 11 5; 12 7; 14 4] -%! number_of_clusters = 2 -%! -%! ## Using fcm, classify the input data, print the cluster centers, -%! ## and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! fcm (input_data, number_of_clusters, [NaN NaN NaN 0]); -%! puts ("\nResults using the Fuzzy C-Means algorithm:\n\n"); -%! cluster_centers -%! printf ("partition coefficient: %f\n", ... -%! partition_coeff (soft_partition)); -%! -%! ## Using gustafson_kessel, classify the input data, print the cluster -%! ## centers, and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! gustafson_kessel (input_data, number_of_clusters, [1 1 1], ... -%! [NaN NaN NaN 0]); -%! puts ("\nResults using the Gustafson-Kessel algorithm:\n\n"); -%! cluster_centers -%! printf ("partition coefficient: %f\n\n", ... -%! partition_coeff (soft_partition)); - -##---------------------------------------------------------------------- -## Partition Coefficient Demo #2 -##---------------------------------------------------------------------- - -%!demo -%! ## Use the Fuzzy C-Means and Gustafson-Kessel algorithms to classify -%! ## three-dimensional unlabeled data points and evaluate the quality -%! ## of the resulting clusters. -%! -%! ## Note: The input_data was selected to form three areas of -%! ## different shapes. -%! -%! input_data = [1 11 5; 1 12 6; 1 13 5; 2 11 7; 2 12 6; 2 13 7; 3 11 6; -%! 3 12 5; 3 13 7; 1 1 10; 1 3 9; 2 2 11; 3 1 9; 3 3 10; -%! 3 5 11; 4 4 9; 4 6 8; 5 5 8; 5 7 9; 6 6 10; 9 10 12; -%! 9 12 13; 9 13 14; 10 9 13; 10 13 12; 11 10 14; -%! 11 12 13; 12 6 12; 12 7 15; 12 9 15; 14 6 14; 14 8 13] -%! number_of_clusters = 3 -%! -%! ## Using fcm, classify the input data, print the cluster centers, -%! ## and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! fcm (input_data, number_of_clusters, [NaN NaN NaN 0]); -%! puts ("\nResults using the Fuzzy C-Means algorithm:\n\n"); -%! cluster_centers -%! printf ("partition coefficient: %f\n", ... -%! partition_coeff (soft_partition)); -%! -%! ## Using gustafson_kessel, classify the input data, print the cluster -%! ## centers, and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! gustafson_kessel (input_data, number_of_clusters, [1 1 1], ... -%! [NaN NaN NaN 0]); -%! puts ("\nResults using the Gustafson-Kessel algorithm:\n\n"); -%! cluster_centers -%! printf ("partition coefficient: %f\n\n", ... -%! partition_coeff (soft_partition)); Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/partition_entropy.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/partition_entropy.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/partition_entropy.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -35,6 +35,12 @@ ## @var{vpe} - the partition entropy for the given soft partition ## @end itemize ## +## For demos of this function, please type: +## @example +## demo 'fcm' +## demo 'gustafson_kessel' +## @end example +## ## For more information about the @var{soft_partition} matrix, please see the ## documentation for function fcm. ## @@ -46,7 +52,7 @@ ## Keywords: fuzzy-logic-toolkit partition entropy cluster ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: partition_entropy.m -## Last-Modified: 26 Aug 2012 +## Last-Modified: 4 Sep 2012 ##---------------------------------------------------------------------- ## Note: This function is an implementation of Equation 13.10 in @@ -86,77 +92,3 @@ vpe = -(sum (sum (Mu .* log_a_Mu))) / n; endfunction - -##---------------------------------------------------------------------- -## Partition Entropy Demo #1 -##---------------------------------------------------------------------- - -%!demo -%! ## Use the Fuzzy C-Means and Gustafson-Kessel algorithms to classify -%! ## a small set of unlabeled data points and evaluate the quality -%! ## of the resulting clusters. -%! -%! ## Note: The input_data is taken from Chapter 13, Example 17 in -%! ## Fuzzy Logic: Intelligence, Control and Information, by -%! ## J. Yen and R. Langari, Prentice Hall, 1999, page 381 -%! ## (International Edition). -%! -%! input_data = [2 12; 4 9; 7 13; 11 5; 12 7; 14 4] -%! number_of_clusters = 2 -%! -%! ## Using fcm, classify the input data, print the cluster centers, -%! ## and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! fcm (input_data, number_of_clusters, [NaN NaN NaN 0]); -%! puts ("\nResults using the Fuzzy C-Means algorithm:\n\n"); -%! cluster_centers -%! printf ("partition entropy (with a = 2): %f\n", ... -%! partition_entropy (soft_partition, 2)); -%! -%! ## Using gustafson_kessel, classify the input data, print the cluster -%! ## centers, and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! gustafson_kessel (input_data, number_of_clusters, [1 1 1], ... -%! [NaN NaN NaN 0]); -%! puts ("\nResults using the Gustafson-Kessel algorithm:\n\n"); -%! cluster_centers -%! printf ("partition entropy (with a = 2): %f\n\n", ... -%! partition_entropy (soft_partition, 2)); - -##---------------------------------------------------------------------- -## Partition Entropy Demo #2 -##---------------------------------------------------------------------- - -%!demo -%! ## Use the Fuzzy C-Means and Gustafson-Kessel algorithms to classify -%! ## three-dimensional unlabeled data points and evaluate the quality -%! ## of the resulting clusters. -%! -%! ## Note: The input_data was selected to form three areas of -%! ## different shapes. -%! -%! input_data = [1 11 5; 1 12 6; 1 13 5; 2 11 7; 2 12 6; 2 13 7; 3 11 6; -%! 3 12 5; 3 13 7; 1 1 10; 1 3 9; 2 2 11; 3 1 9; 3 3 10; -%! 3 5 11; 4 4 9; 4 6 8; 5 5 8; 5 7 9; 6 6 10; 9 10 12; -%! 9 12 13; 9 13 14; 10 9 13; 10 13 12; 11 10 14; -%! 11 12 13; 12 6 12; 12 7 15; 12 9 15; 14 6 14; 14 8 13] -%! number_of_clusters = 3 -%! -%! ## Using fcm, classify the input data, print the cluster centers, -%! ## and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! fcm (input_data, number_of_clusters, [NaN NaN NaN 0]); -%! puts ("\nResults using the Fuzzy C-Means algorithm:\n\n"); -%! cluster_centers -%! printf ("partition entropy (with a = 2): %f\n", ... -%! partition_entropy (soft_partition, 2)); -%! -%! ## Using gustafson_kessel, classify the input data, print the cluster -%! ## centers, and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! gustafson_kessel (input_data, number_of_clusters, [1 1 1], ... -%! [NaN NaN NaN 0]); -%! puts ("\nResults using the Gustafson-Kessel algorithm:\n\n"); -%! cluster_centers -%! printf ("partition entropy (with a = 2): %f\n\n", ... -%! partition_entropy (soft_partition, 2)); Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/rmmf.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/rmmf.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/rmmf.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -46,7 +46,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy membership ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: rmmf.m -## Last-Modified: 16 Jul 2011 +## Last-Modified: 20 Aug 2012 function fis = rmmf (fis, in_or_out, var_index, mf, mf_index) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/sugeno_tip_calculator.fis =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/sugeno_tip_calculator.fis 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/sugeno_tip_calculator.fis 2012-10-03 00:38:09 UTC (rev 11097) @@ -1,3 +1,27 @@ +## Copyright (C) 2011-2012 L. Markowsky <lm...@us...> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: sugeno_tip_calculator.fis +## Last-Modified: 28 Aug 2012 + % Sugeno Tip Calculator % Computes cheap, average, and generous tips Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/sugeno_tip_demo.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/sugeno_tip_demo.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/sugeno_tip_demo.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -49,7 +49,7 @@ ## Dr. Bruce Segee (University of Maine Dept. of ECE). ## Directory: fuzzy-logic-toolkit/inst ## Filename: sugeno_tip_demo.m -## Last-Modified: 10 Nov 2011 +## Last-Modified: 20 Aug 2012 ## Read the FIS structure from a file. fis = readfis ('sugeno_tip_calculator.fis'); Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/xie_beni_index.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/xie_beni_index.m 2012-10-03 00:37:18 UTC (rev 11096) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/xie_beni_index.m 2012-10-03 00:38:09 UTC (rev 11097) @@ -37,6 +37,12 @@ ## @var{vxb} - the Xie-Beni validity index for the given partition ## @end itemize ## +## For demos of this function, please type: +## @example +## demo 'fcm' +## demo 'gustafson_kessel' +## @end example +## ## For more information about the @var{input_data}, @var{cluster_centers}, ## and @var{soft_partition} matrices, please see the documentation for function ## fcm. @@ -49,7 +55,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy xie beni cluster validity ## Directory: fuzzy-logic-toolkit/inst/ ## Filename: xie_beni_index.m -## Last-Modified: 26 Aug 2012 +## Last-Modified: 4 Sep 2012 function vxb = xie_beni_index (input_data, cluster_centers, ... soft_partition) @@ -126,77 +132,3 @@ d_sqr_min = min (min (d_sqr_matrix)); endfunction - -##---------------------------------------------------------------------- -## Xie-Beni Index Demo #1 -##---------------------------------------------------------------------- - -%!demo -%! ## Use the Fuzzy C-Means and Gustafson-Kessel algorithms to classify -%! ## a small set of unlabeled data points and evaluate the quality -%! ## of the resulting clusters. -%! -%! ## Note: The input_data is taken from Chapter 13, Example 17 in -%! ## Fuzzy Logic: Intelligence, Control and Information, by -%! ## J. Yen and R. Langari, Prentice Hall, 1999, page 381 -%! ## (International Edition). -%! -%! input_data = [2 12; 4 9; 7 13; 11 5; 12 7; 14 4] -%! number_of_clusters = 2 -%! -%! ## Using fcm, classify the input data, print the cluster centers, -%! ## and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! fcm (input_data, number_of_clusters, [NaN NaN NaN 0]); -%! puts ("\nResults using the Fuzzy C-Means algorithm:\n\n"); -%! cluster_centers -%! printf ("Xie-Beni index: %f\n", ... -%! xie_beni_index (input_data, cluster_centers, soft_partition)); -%! -%! ## Using gustafson_kessel, classify the input data, print the cluster -%! ## centers, and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! gustafson_kessel (input_data, number_of_clusters, [1 1 1], ... -%! [NaN NaN NaN 0]); -%! puts ("\nResults using the Gustafson-Kessel algorithm:\n\n"); -%! cluster_centers -%! printf ("Xie-Beni index: %f\n\n", ... -%! xie_beni_index (input_data, cluster_centers, soft_partition)); - -##---------------------------------------------------------------------- -## Xie-Beni Index Demo #2 -##---------------------------------------------------------------------- - -%!demo -%! ## Use the Fuzzy C-Means and Gustafson-Kessel algorithms to classify -%! ## three-dimensional unlabeled data points and evaluate the quality -%! ## of the resulting clusters. -%! -%! ## Note: The input_data was selected to form three areas of -%! ## different shapes. -%! -%! input_data = [1 11 5; 1 12 6; 1 13 5; 2 11 7; 2 12 6; 2 13 7; 3 11 6; -%! 3 12 5; 3 13 7; 1 1 10; 1 3 9; 2 2 11; 3 1 9; 3 3 10; -%! 3 5 11; 4 4 9; 4 6 8; 5 5 8; 5 7 9; 6 6 10; 9 10 12; -%! 9 12 13; 9 13 14; 10 9 13; 10 13 12; 11 10 14; -%! 11 12 13; 12 6 12; 12 7 15; 12 9 15; 14 6 14; 14 8 13] -%! number_of_clusters = 3 -%! -%! ## Using fcm, classify the input data, print the cluster centers, -%! ## and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! fcm (input_data, number_of_clusters, [NaN NaN NaN 0]); -%! puts ("\nResults using the Fuzzy C-Means algorithm:\n\n"); -%! cluster_centers -%! printf ("Xie-Beni index: %f\n", ... -%! xie_beni_index (input_data, cluster_centers, soft_partition)); -%! -%! ## Using gustafson_kessel, classify the input data, print the cluster -%! ## centers, and calculate and print the partition coefficient. -%! [cluster_centers, soft_partition, obj_fcn_history] = ... -%! gustafson_kessel (input_data, number_of_clusters, [1 1 1], ... -%! [NaN NaN NaN 0]); -%! puts ("\nResults using the Gustafson-Kessel algorithm:\n\n"); -%! cluster_centers -%! printf ("Xie-Beni index: %f\n\n", ... -%! xie_beni_index (input_data, cluster_centers, soft_partition)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lm...@us...> - 2012-10-03 00:37:25
|
Revision: 11096 http://octave.svn.sourceforge.net/octave/?rev=11096&view=rev Author: lmarkov Date: 2012-10-03 00:37:18 +0000 (Wed, 03 Oct 2012) Log Message: ----------- M private/square_distance_matrix.m M private/is_mf_struct.m M private/is_string.m M private/is_domain.m M private/is_builtin_language.m M private/evalmf_private.m M private/is_var_index.m M private/is_fis.m M private/is_real.m M private/is_io_vector.m M private/are_input_indices.m M private/is_rule_vector.m M private/is_ref_input.m M private/is_grid_spec.m M private/is_real_matrix.m M private/is_io_struct.m M private/is_pos_int.m M private/is_rule_struct.m M private/is_mf_vector.m M private/are_bounds.m M private/is_output_index.m M private/is_format.m M private/is_mf_index.m M private/is_row_vector.m M private/is_rule_index_list.m M private/is_int.m Modified Paths: -------------- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/are_bounds.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/are_input_indices.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/evalmf_private.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_builtin_language.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_domain.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_fis.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_format.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_grid_spec.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_int.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_io_struct.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_io_vector.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_index.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_struct.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_vector.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_output_index.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_pos_int.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_real.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_real_matrix.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_ref_input.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_row_vector.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_index_list.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_struct.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_vector.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_string.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_var_index.m trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/square_distance_matrix.m Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/are_bounds.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/are_bounds.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/are_bounds.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -32,7 +32,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: are_bounds.m -## Last-Modified: 19 May 2011 +## Last-Modified: 20 Aug 2012 function y = are_bounds (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/are_input_indices.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/are_input_indices.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/are_input_indices.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -29,7 +29,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: are_input_indices.m -## Last-Modified: 19 May 2011 +## Last-Modified: 20 Aug 2012 function y = are_input_indices (x, fis) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/evalmf_private.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/evalmf_private.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/evalmf_private.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -18,8 +18,8 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {@var{y} =} evalmf_private (@var{x}, @var{param}, @var{mf_type}) -## @deftypefn {Function File} {@var{y} =} evalmf_private (@var{x}, @var{param}, @var{mf_type}, @var{hedge}) -## @deftypefn {Function File} {@var{y} =} evalmf_private (@var{x}, @var{param}, @var{mf_type}, @var{hedge}, @var{not_flag}) +## @deftypefnx {Function File} {@var{y} =} evalmf_private (@var{x}, @var{param}, @var{mf_type}, @var{hedge}) +## @deftypefnx {Function File} {@var{y} =} evalmf_private (@var{x}, @var{param}, @var{mf_type}, @var{hedge}, @var{not_flag}) ## @deftypefnx {Function File} {@var{y} =} evalmf_private (@var{[x1 x2 ... xn]}, @var{[param1 ... ]}, '<@var{mf_type}>') ## @deftypefnx {Function File} {@var{y} =} evalmf_private (@var{[x1 x2 ... xn]}, @var{[param1 ... ]}, '<@var{mf_type}>', @var{hedge}) ## @deftypefnx {Function File} {@var{y} =} evalmf_private (@var{[x1 x2 ... xn]}, @var{[param1 ... ]}, '<@var{mf_type}>', @var{hedge}, @var{not_flag}) @@ -34,7 +34,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy membership-function evaluate ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: evalmf_private.m -## Last-Modified: 20 Aug 2012 +## Last-Modified: 3 Sep 2012 function y = evalmf_private (x, params, mf_type, hedge = 0, ... not_flag = false) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_builtin_language.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_builtin_language.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_builtin_language.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -17,14 +17,14 @@ ## see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {@var{y} =} is_language (@var{x}) +## @deftypefn {Function File} {@var{y} =} is_builtin_language (@var{x}) ## ## Return 1 if @var{x} is one of the strings representing the ## built-in languages, and return 0 otherwise. The comparison is ## case-insensitive. ## -## is_language is a private function that localizes the test for -## languages handled by showrule. +## is_builtin_language is a private function that localizes the test +## for languages handled by showrule. ## ## @end deftypefn @@ -32,7 +32,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_builtin_language.m -## Last-Modified: 4 Nov 2011 +## Last-Modified: 3 Sep 2012 function y = is_builtin_language (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_domain.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_domain.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_domain.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -32,7 +32,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_domain.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_domain (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_fis.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_fis.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_fis.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -47,7 +47,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_fis.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_fis (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_format.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_format.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_format.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -31,7 +31,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_format.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_format (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_grid_spec.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_grid_spec.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_grid_spec.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -28,7 +28,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_grid_spec.m -## Last-Modified: 28 Aug 2011 +## Last-Modified: 20 Aug 2012 function y = is_grid_spec (x, fis) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_int.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_int.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_int.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -42,7 +42,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_int.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_int (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_io_struct.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_io_struct.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_io_struct.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -33,7 +33,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_io_struct.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_io_struct (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_io_vector.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_io_vector.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_io_vector.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -31,7 +31,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_io_vector.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_io_vector (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_index.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_index.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_index.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -37,7 +37,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_mf_index.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_mf_index (fis, in_or_out, var_index, mf_index) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_struct.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_struct.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_struct.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -33,7 +33,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_mf_struct.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_mf_struct (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_vector.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_vector.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_mf_vector.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -30,7 +30,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_mf_vector.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_mf_vector (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_output_index.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_output_index.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_output_index.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -28,7 +28,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_output_index.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_output_index (x, fis) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_pos_int.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_pos_int.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_pos_int.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -39,7 +39,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_pos_int.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_pos_int (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_real.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_real.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_real.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -43,7 +43,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_real.m -## Last-Modified: 4 Nov 2011 +## Last-Modified: 20 Aug 2012 function y = is_real (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_real_matrix.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_real_matrix.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_real_matrix.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -40,7 +40,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_real_matrix.m -## Last-Modified: 4 Nov 2011 +## Last-Modified: 20 Aug 2012 function y = is_real_matrix (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_ref_input.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_ref_input.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_ref_input.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -28,7 +28,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_ref_input.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_ref_input (x, fis, graphed_inputs) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_row_vector.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_row_vector.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_row_vector.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -36,7 +36,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_row_vector.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_row_vector (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_index_list.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_index_list.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_index_list.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -41,7 +41,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_rule_index_list.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_rule_index_list (x, max_index) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_struct.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_struct.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_struct.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -33,7 +33,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_rule_struct.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_rule_struct (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_vector.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_vector.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_rule_vector.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -31,7 +31,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_rule_vector.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_rule_vector (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_string.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_string.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_string.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -33,7 +33,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_string.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_string (x) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_var_index.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_var_index.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/is_var_index.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -35,7 +35,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private parameter-test ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: is_var_index.m -## Last-Modified: 20 May 2011 +## Last-Modified: 20 Aug 2012 function y = is_var_index (fis, in_or_out, var_index) Modified: trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/square_distance_matrix.m =================================================================== --- trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/square_distance_matrix.m 2012-10-01 10:34:50 UTC (rev 11095) +++ trunk/octave-forge/main/fuzzy-logic-toolkit/inst/private/square_distance_matrix.m 2012-10-03 00:37:18 UTC (rev 11096) @@ -32,7 +32,7 @@ ## Keywords: fuzzy-logic-toolkit fuzzy private ## Directory: fuzzy-logic-toolkit/inst/private/ ## Filename: square_dist_matrix.m -## Last-Modified: 12 Apr 2012 +## Last-Modified: 20 Aug 2012 function sqr_dist = square_distance_matrix (X, V) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jgp...@us...> - 2012-10-01 10:35:03
|
Revision: 11095 http://octave.svn.sourceforge.net/octave/?rev=11095&view=rev Author: jgpallero Date: 2012-10-01 10:34:50 +0000 (Mon, 01 Oct 2012) Log Message: ----------- Update OctCLIP in geometry package Modified Paths: -------------- trunk/octave-forge/main/geometry/inst/octclip/oc_polybool.m trunk/octave-forge/main/geometry/inst/octclip/src/Makefile trunk/octave-forge/main/geometry/inst/octclip/src/_oc_polybool.cc trunk/octave-forge/main/geometry/inst/octclip/src/compilador.c trunk/octave-forge/main/geometry/inst/octclip/src/errores.c trunk/octave-forge/main/geometry/inst/octclip/src/eucli.c trunk/octave-forge/main/geometry/inst/octclip/src/fgeneral.c trunk/octave-forge/main/geometry/inst/octclip/src/greiner.c trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/compilador.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/constantes.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/errores.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/eucli.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/fgeneral.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/general.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/geom.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/greiner.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/polig.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/ptopol.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/segmento.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/ventorno.h trunk/octave-forge/main/geometry/inst/octclip/src/polig.c trunk/octave-forge/main/geometry/inst/octclip/src/ptopol.c trunk/octave-forge/main/geometry/inst/octclip/src/segmento.c trunk/octave-forge/main/geometry/inst/octclip/src/ventorno.c Added Paths: ----------- trunk/octave-forge/main/geometry/inst/octclip/src/calctopo.c trunk/octave-forge/main/geometry/inst/octclip/src/dpeucker.c trunk/octave-forge/main/geometry/inst/octclip/src/geocnan.c trunk/octave-forge/main/geometry/inst/octclip/src/geocomp.c trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/calctopo.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/dpeucker.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/geocnan.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/geocomp.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/polil.h trunk/octave-forge/main/geometry/inst/octclip/src/libgeoc/recpolil.h trunk/octave-forge/main/geometry/inst/octclip/src/polil.c trunk/octave-forge/main/geometry/inst/octclip/src/recpolil.c Modified: trunk/octave-forge/main/geometry/inst/octclip/oc_polybool.m =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/oc_polybool.m 2012-10-01 10:14:28 UTC (rev 11094) +++ trunk/octave-forge/main/geometry/inst/octclip/oc_polybool.m 2012-10-01 10:34:50 UTC (rev 11095) @@ -17,8 +17,8 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn{Function File}{[@var{X},@var{Y},@var{nPol},@var{nInt},@var{nPert}] =}_oc_polybool(@var{sub},@var{clip},@var{op}) -## @deftypefnx{Function File}{[@var{X},@var{Y},@var{nPol},@var{nInt},@var{nPert}] =}_oc_polybool(@var{sub},@var{clip}) +## @deftypefn{Function File}{[@var{X},@var{Y},@var{nPol},@var{nInt},@var{nPert}] =}oc_polybool(@var{sub},@var{clip},@var{op}) +## @deftypefnx{Function File}{[@var{X},@var{Y},@var{nPol},@var{nInt},@var{nPert}] =}oc_polybool(@var{sub},@var{clip}) ## ## This function performs boolean operations between two polygons using the ## Greiner-Hormann algorithm (http://davis.wpi.edu/~matt/courses/clipping/). @@ -45,13 +45,13 @@ ## ## For the matrices @var{sub} and @var{clip}, the first point is not needed to ## be repeated at the end (but is permitted). Pairs of (NaN,NaN) coordinates in -## @var{sub} and/or @var{clip} are omitted. +## @var{sub} and/or @var{clip} are ommitted. ## -## @var{X} is a column vector containing the X coordinates of the vertices for. -## resultant polygon(s). +## @var{X} is a column vector containing the X coordinates of the vertices of +## the resultant polygon(s). ## -## @var{Y} is a column vector containing the Y coordinates of the vertices for. -## resultant polygon(s). +## @var{Y} is a column vector containing the Y coordinates of the vertices of +## the resultant polygon(s). ## ## @var{nPol} is the number of output polygons. ## Modified: trunk/octave-forge/main/geometry/inst/octclip/src/Makefile =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/Makefile 2012-10-01 10:14:28 UTC (rev 11094) +++ trunk/octave-forge/main/geometry/inst/octclip/src/Makefile 2012-10-01 10:34:50 UTC (rev 11095) @@ -3,8 +3,9 @@ MKOCTFILE := mkoctfile endif -CLIPOBJECT = compilador.o errores.o eucli.o fgeneral.o greiner.o polig.o \ - ptopol.o segmento.o ventorno.o +CLIPOBJECT = calctopo.o compilador.o dpeucker.o errores.o eucli.o fgeneral.o \ + geocnan.o geocomp.o greiner.o polig.o polil.o ptopol.o recpolil.o \ + segmento.o ventorno.o FLAGS = -Wall -Wextra %.o: %.c Modified: trunk/octave-forge/main/geometry/inst/octclip/src/_oc_polybool.cc =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/_oc_polybool.cc 2012-10-01 10:14:28 UTC (rev 11094) +++ trunk/octave-forge/main/geometry/inst/octclip/src/_oc_polybool.cc 2012-10-01 10:34:50 UTC (rev 11095) @@ -49,12 +49,12 @@ \n\ For the matrices @var{sub} and @var{clip}, the first point is not needed to\n\ be repeated at the end (but is permitted). Pairs of (NaN,NaN) coordinates in\n\ -@var{sub} and/or @var{clip} are omitted.\n\ +@var{sub} and/or @var{clip} are ommitted.\n\ \n\ -@var{X} is a column vector containing the X coordinates of the vertices for.\n\ -resultant polygon(s).\n\n\ -@var{Y} is a column vector containing the Y coordinates of the vertices for.\n\ -resultant polygon(s).\n\n\ +@var{X} is a column vector containing the X coordinates of the vertices of\n\ +the resultant polygon(s).\n\n\ +@var{Y} is a column vector containing the Y coordinates of the vertices of\n\ +the resultant polygon(s).\n\n\ @var{nPol} is the number of output polygons.\n\n\ @var{nInt} is the number of intersections between @var{sub} and @var{clip}.\n\n\ @var{nPert} is the number of perturbed points of the @var{clip} polygon in\n\ @@ -117,7 +117,7 @@ //operation identifier enum GEOC_OP_BOOL_POLIG op=GeocOpBoolInter; //output struct - poligGreiner* result=NULL; + polig* result=NULL; //number of polygons, intersections and perturbations size_t nPol=0,nInter=0,nPert=0; //number of elements for the output vectors @@ -231,7 +231,7 @@ //free memory LibMemPoliClip(polA); LibMemPoliClip(polB); - LibMemPoligGreiner(result); + LibMemPolig(result); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// Added: trunk/octave-forge/main/geometry/inst/octclip/src/calctopo.c =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/calctopo.c (rev 0) +++ trunk/octave-forge/main/geometry/inst/octclip/src/calctopo.c 2012-10-01 10:34:50 UTC (rev 11095) @@ -0,0 +1,71 @@ +/* -*- coding: utf-8 -*- */ +/** +\ingroup geodesia geom +@{ +\file calctopo.c +\brief Definición de funciones para cálculos de topografía. +\author José Luis García Pallero, jgp...@gm... +\date 05 de julio de 2011 +\section Licencia Licencia +Copyright (c) 2011, José Luis García Pallero. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name of the copyright holders nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/******************************************************************************/ +/******************************************************************************/ +#include"libgeoc/calctopo.h" +/******************************************************************************/ +/******************************************************************************/ +double AcimutTopografico(const double x1, + const double y1, + const double x2, + const double y2) +{ + //acimut calculado + double acimut=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos el acimut en el dominio [-pi pi] + acimut = atan2(x2-x1,y2-y1); + //comprobamos si ha salido un valor negativo + if(acimut<0.0) + { + //metemos el valor en dominio + acimut += 2.0*GEOC_CONST_PI; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return acimut; +} +/******************************************************************************/ +/******************************************************************************/ +/** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Modified: trunk/octave-forge/main/geometry/inst/octclip/src/compilador.c =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/compilador.c 2012-10-01 10:14:28 UTC (rev 11094) +++ trunk/octave-forge/main/geometry/inst/octclip/src/compilador.c 2012-10-01 10:34:50 UTC (rev 11095) @@ -73,3 +73,10 @@ /******************************************************************************/ /******************************************************************************/ /** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Added: trunk/octave-forge/main/geometry/inst/octclip/src/dpeucker.c =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/dpeucker.c (rev 0) +++ trunk/octave-forge/main/geometry/inst/octclip/src/dpeucker.c 2012-10-01 10:34:50 UTC (rev 11095) @@ -0,0 +1,472 @@ +/* -*- coding: utf-8 -*- */ +/** +\ingroup geom +@{ +\file dpeucker.c +\brief Definición de funciones para el aligerado de polilíneas basadas en el + algoritmo de Douglas-Peucker. +\author José Luis García Pallero, jgp...@gm... +\date 04 de julio de 2011 +\section Licencia Licencia +Copyright (c) 2011, José Luis García Pallero. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name of the copyright holders nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/******************************************************************************/ +/******************************************************************************/ +#include"libgeoc/dpeucker.h" +/******************************************************************************/ +/******************************************************************************/ +size_t* AligeraPolilinea(const double* x, + const double* y, + const size_t nPtos, + const size_t incX, + const size_t incY, + const double tol, + const enum GEOC_DPEUCKER_ROBUSTO robusto, + const size_t nPtosRobusto, + const size_t nSegRobusto, + size_t* nPtosSal) +{ + //índice para recorrer bucles + size_t p=0; + //índice de los puntos de trabajo + size_t i=0,j=0,k=0; + //coordenadas de trabajo + double xIni=0.0,yIni=0.0,xFin=0.0,yFin=0.0,xTrab=0.0,yTrab=0.0; + //altura del triángulo de trabajo + double h=0.0; + //variable indicadora de punto a mantener + int usado=0; + //número de elementos de trabajo internos del vector de salida + size_t nElem=0; + //vector de salida + size_t* sal=NULL; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //iniciamos la variable de salida de número de puntos a 0 + *nPtosSal = 0; + //comprobamos casos especiales de nPtos + if(nPtos==0) + { + //salimos de la función con NULL + return NULL; + } + else if(nPtos<=2) + { + //asignamos el número de puntos usados + *nPtosSal = nPtos; + //asignamos memoria para el vector de salida + sal = (size_t*)malloc((*nPtosSal)*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + //asignamos valores al vector de salida + for(i=0;i<(*nPtosSal);i++) + { + //asignamos el índice de trabajo + sal[i] = i; + } + //salimos de la función + return sal; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //inicializamos el indicador interno de tamaño del vector + nElem = GEOC_DPEUCKER_BUFFER_PTOS; + //asignamos memoria para el vector de salida + sal = (size_t*)malloc(nElem*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + //indicamos que el primer punto siempre se usa + *nPtosSal = 1; + sal[0] = 0; + //puntos de trabajo para iniciar los cálculos + i = 0; + j = 1; + k = 2; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //entramos en un bucle infinito + while(1) + { + //comprobamos si hay que salir del bucle + if(k>(nPtos-1)) + { + //salimos del bucle + break; + } + //coordenadas de la base del triángulo + xIni = x[i*incX]; + yIni = y[i*incY]; + xFin = x[k*incX]; + yFin = y[k*incY]; + //inicializamos a 0 la variable de punto usado + usado = 0; + //recorremos los puntos a testear + for(p=j;p<k;p++) + { + //coordenadas del vértice del triángulo + xTrab = x[p*incX]; + yTrab = y[p*incY]; + //calculamos la altura del triángulo + h = AlturaTriangulo(xTrab,yTrab,xIni,yIni,xFin,yFin); + //comprobamos si la altura supera a la tolerancia + if(h>tol) + { + //indicamos que el punto ha sido usado + usado = 1; + //comprobamos si se utiliza el algoritmo robusto + if(robusto!=GeocDPeuckerRobNo) + { + //comprobamos si hay que aplicar el algoritmo de + //intersección con puntos originales + if((robusto==GeocDPeuckerRobSi)|| + (robusto==GeocDPeuckerRobOrig)) + { + //aplicamos el algoritmo + AligPolilRobIntersecOrig(x,y,nPtos,incX,incY, + nPtosRobusto,i,&p); + } + //comprobamos si hay que aplicar el algoritmo de auto + //intersección + if((robusto==GeocDPeuckerRobSi)|| + (robusto==GeocDPeuckerRobAuto)) + { + //indicamos un número de puntos para el vector de salida + //una unidad menor que el número realmente almacenado + //para evitar el segmento inmediatamente anterior al que + //vamos a crear + AligPolilRobAutoIntersec(x,y,incX,incY,sal, + (*nPtosSal)-1,nSegRobusto,i, + &p); + } + } + //añadimos al contador este nuevo punto + (*nPtosSal)++; + //comprobamos si hay que reasignar memoria + if((*nPtosSal)>nElem) + { + //añadimos otro grupo de puntos + nElem += GEOC_DPEUCKER_BUFFER_PTOS; + //asignamos memoria para el vector de salida + sal = (size_t*)realloc(sal,nElem*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + } + //añadimos el nuevo punto usado + sal[(*nPtosSal)-1] = p; + //actualizamos los índices de los puntos de trabajo + i = p; + j = i+1; + k = j+1; + //salimos del bucle + break; + } + } + //comprobamos si no se ha utilizado ninguno de los vértices candidatos + if(!usado) + { + //pasamos al siguiente punto como extremo del segmento + k++; + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //comprobamos si el último punto se ha añadido + if(sal[(*nPtosSal)-1]!=(nPtos-1)) + { + //añadimos al contador el último punto + (*nPtosSal)++; + //comprobamos si hay que reasignar memoria + if((*nPtosSal)>nElem) + { + //añadimos otro grupo de puntos + nElem += GEOC_DPEUCKER_BUFFER_PTOS; + //asignamos memoria para el vector de salida + sal = (size_t*)realloc(sal,nElem*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + } + //asignamos el último punto + sal[(*nPtosSal)-1] = nPtos-1; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //comprobamos si el vector de salida tiene demasiada memoria asignada + if(nElem>(*nPtosSal)) + { + //ajustamos el tamaño del vector de salida + sal = (size_t*)realloc(sal,(*nPtosSal)*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return sal; +} +/******************************************************************************/ +/******************************************************************************/ +void AligPolilRobIntersecOrig(const double* x, + const double* y, + const size_t nPtos, + const size_t incX, + const size_t incY, + const size_t ptosAUsar, + const size_t posIni, + size_t* posFin) +{ + //índices para recorrer bucles + size_t i=0,j=0; + //coordenadas de trabajo + double xA=0.0,yA=0.0,xB=0.0,yB=0.0,xC=0.0,yC=0.0,xD=0.0,yD=0.0; + //punto de parada para comprobar la intersección de segmentos + size_t parada=0; + //identificador de intersección + int inter=0; + //variables auxiliares + size_t aux=0; + double xAux=0.0,yAux=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //contemplamos una posible salida rápida + if((*posFin)<=(posIni+1)) + { + //salimos de la función + return; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos el número de puntos que quedan hasta el final de los vectores + //de coordenadas desde la posición de fin de segmento (contándola) + aux = nPtos-(*posFin); + //calculamos el punto de parada para la intersección de segmentos + if((aux>ptosAUsar)&&(ptosAUsar!=0)) + { + //paramos en un pnto tal que usemos ptosAUsar puntos + parada = *posFin+ptosAUsar-1; + } + else + { + //paramos en el penúltimo punto + parada = nPtos-2; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //las coordenadas del punto inicial del segmento base no cambian nunca + xA = x[posIni*incX]; + yA = y[posIni*incY]; + //recorremos los puntos candidatos hasta el anterior al punto base + for(i=(*posFin);i>posIni;i--) + { + //comprobamos si estamos ante el punto posterior al inicial + if(i==(posIni+1)) + { + //terminamos, porque este punto es el siguiente al punto base en el + //listado original + *posFin = i; + //salimos del bucle + break; + } + else + { + //coordenadas de los puntos inicial y final del segmento base + xB = x[i*incX]; + yB = y[i*incY]; + //recorremos los puntos posteriores hasta el de parada + for(j=i;j<=parada;j++) + { + //coordenadas de los puntos inicial y final del siguiente + //segmento + xC = x[j*incX]; + yC = y[j*incY]; + xD = x[(j+1)*incX]; + yD = y[(j+1)*incY]; + //calculamos la intersección entre los segmentos + inter = IntersecSegmentos2D(xA,yA,xB,yB,xC,yC,xD,yD,&xAux, + &yAux); + //comprobamos si hay intersección entre los segmentos + if(inter!=GEOC_SEG_NO_INTERSEC) + { + //salimos del bucle + break; + } + } + //comprobamos si no ha habido ninguna intersección + if(inter==GEOC_SEG_NO_INTERSEC) + { + //indicamos el índice del vértice final + *posFin = i; + //salimos del bucle + break; + } + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return; +} +/******************************************************************************/ +/******************************************************************************/ +void AligPolilRobAutoIntersec(const double* x, + const double* y, + const size_t incX, + const size_t incY, + const size_t* posAlig, + const size_t nPosAlig, + const size_t segAUsar, + const size_t posIni, + size_t* posFin) +{ + //índices para recorrer bucles + size_t i=0,j=0; + //variables de posición + size_t k=0,l=0,pos=0; + //coordenadas de trabajo + double xA=0.0,yA=0.0,xB=0.0,yB=0.0,xC=0.0,yC=0.0,xD=0.0,yD=0.0; + //número de segmentos calculados hasta ahora, excepto el último + size_t nSeg=0; + //identificador de intersección + int inter=0; + //variables auxiliares + double xAux=0.0,yAux=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //contemplamos una posible salida rápida + if(((*posFin)<=(posIni+1))||(nPosAlig<2)) + { + //salimos de la función + return; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos el número de segmentos calculados hasta ahora, excepto el + //anterior al de trabajo + nSeg = nPosAlig-1; + //comprobamos si se usan todos los segmentos o sólo parte + if(segAUsar!=0) + { + //asignamos el número de segmentos a utilizar + nSeg = (nSeg>segAUsar) ? segAUsar : nSeg; + } + //las coordenadas del punto inicial del segmento base no cambian nunca + xA = x[posIni*incX]; + yA = y[posIni*incY]; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //recorremos los puntos candidatos hasta el anterior al punto base + for(i=(*posFin);i>posIni;i--) + { + //comprobamos si estamos ante el punto posterior al inicial + if(i==(posIni+1)) + { + //terminamos, porque este punto es el siguiente al punto inicial + *posFin = i; + //salimos del bucle + break; + } + else + { + //coordenadas del punto final del segmento base + xB = x[i*incX]; + yB = y[i*incY]; + //recorremos el número de segmentos de trabajo + for(j=0;j<nSeg;j++) + { + //posición del punto inicial del siguiente segmento anterior + pos = nPosAlig-1-j; + //índices inicial y final del siguiente segmento anterior + k = posAlig[pos]; + l = posAlig[pos-1]; + //puntos inicial y final del siguiente segmento + xC = x[k*incX]; + yC = y[k*incY]; + xD = x[l*incX]; + yD = y[l*incY]; + //calculamos la intersección entre los segmentos + inter = IntersecSegmentos2D(xA,yA,xB,yB,xC,yC,xD,yD,&xAux, + &yAux); + //comprobamos si hay intersección entre los segmentos + if(inter!=GEOC_SEG_NO_INTERSEC) + { + //salimos del bucle + break; + } + } + //comprobamos si no ha habido ninguna intersección + if(inter==GEOC_SEG_NO_INTERSEC) + { + //indicamos el índice del vértice final + *posFin = i; + //salimos del bucle + break; + } + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return; +} +/******************************************************************************/ +/******************************************************************************/ +/** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Modified: trunk/octave-forge/main/geometry/inst/octclip/src/errores.c =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/errores.c 2012-10-01 10:14:28 UTC (rev 11094) +++ trunk/octave-forge/main/geometry/inst/octclip/src/errores.c 2012-10-01 10:34:50 UTC (rev 11095) @@ -110,3 +110,10 @@ /******************************************************************************/ /******************************************************************************/ /** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Modified: trunk/octave-forge/main/geometry/inst/octclip/src/eucli.c =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/eucli.c 2012-10-01 10:14:28 UTC (rev 11094) +++ trunk/octave-forge/main/geometry/inst/octclip/src/eucli.c 2012-10-01 10:34:50 UTC (rev 11095) @@ -8,7 +8,7 @@ \author José Luis García Pallero, jgp...@gm... \date 27 de octubre de 2009 \section Licencia Licencia -Copyright (c) 2009-2010, José Luis García Pallero. All rights reserved. +Copyright (c) 2009-2011, José Luis García Pallero. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -157,4 +157,82 @@ } /******************************************************************************/ /******************************************************************************/ +double AnguloVecPlano(const double x1, + const double y1, + const double x2, + const double y2) +{ + //variables auxiliares + double num=0.0,den=0.0; + //variable de salida + double alfa=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos el numerador de la fórmula que da el coseno del ángulo + num = x1*x2+y1*y2; + //calculamos el denominador de la fórmula que da el coseno del ángulo + den = sqrt((x1*x1+y1*y1)*(x2*x2+y2*y2)); + //calculamos el coseno del ángulo, teniendo en cuenta casos singulares + if(den==0.0) + { + //si el denominador es 0.0, el ángulo es 0.0 y su coseno 1.0 + alfa = 1.0; + } + else + { + //no hay singularidad + alfa = num/den; + } + //calculamos el ángulo + alfa = acos(alfa); + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return alfa; +} +/******************************************************************************/ +/******************************************************************************/ +double AlturaTriangulo(const double xVert, + const double yVert, + const double xBase1, + const double yBase1, + const double xBase2, + const double yBase2) +{ + //ángulo entra la base en el punto 1 y el vértice + double alfa=0.0; + //longitud del punto 1 de la base al vértice + double lon=0.0; + //variables auxiliares + double dxv=0.0,dyv=0.0,dxb=0.0,dyb=0.0; + //variable de salida + double h=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos los incrementos de coordenadas auxiliares + dxv = xVert-xBase1; + dyv = yVert-yBase1; + dxb = xBase2-xBase1; + dyb = yBase2-yBase1; + //calculamos el ángulo entre la base y el segmento que une el punto inicial + //de ésta con el vértice + alfa = AnguloVecPlano(dxv,dyv,dxb,dyb); + //longitud del lado que une la base con el vértice 1 de la base + lon = sqrt(dxv*dxv+dyv*dyv); + //calculamos la altura + h = fabs(lon*sin(alfa)); + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return h; +} +/******************************************************************************/ +/******************************************************************************/ /** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Modified: trunk/octave-forge/main/geometry/inst/octclip/src/fgeneral.c =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/fgeneral.c 2012-10-01 10:14:28 UTC (rev 11094) +++ trunk/octave-forge/main/geometry/inst/octclip/src/fgeneral.c 2012-10-01 10:34:50 UTC (rev 11095) @@ -5,6 +5,7 @@ \file fgeneral.c \brief Definición de funciones de utilidad general. \author José Luis García Pallero, jgp...@gm... +\note Este fichero contiene funciones paralelizadas con OpenMP. \date 10 de octubre de 2009 \version 1.0 \section Licencia Licencia @@ -38,6 +39,65 @@ #include"libgeoc/fgeneral.h" /******************************************************************************/ /******************************************************************************/ +int GeocParOmpFgeneral(char version[]) +{ + //comprobamos si hay paralelización +#if defined(_OPENMP) + //comprobamos si hay que extraer versión + if(version!=NULL) + { + //calculamos la versión + VersionOpenMP(_OPENMP,version); + } + //salimos de la función + return 1; +#else + if(version!=NULL) + { + //utilizamos la variable version para que no dé warming al compilar + strcpy(version,""); + } + //salimos de la función + return 0; +#endif +} +/******************************************************************************/ +/******************************************************************************/ +double PonAnguloDominio(const double angulo) +{ + //signo del ángulo de trabajo + double signo=0.0; + //2.0*pi + double dosPi=2.0*GEOC_CONST_PI; + //variable auxiliar + double aux=angulo; + //variable de salida + double sal=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //sólo trabajamos si el valor de entrada está fuera de los límites + if((angulo<=-dosPi)||(angulo>=dosPi)) + { + //extraemos el signo del ángulo pasado + signo = GEOC_SIGNO(angulo); + //valor absoluto del ángulo pasado + aux = fabs(angulo); + //metemos el ángulo en dominio eliminando la cantidad que se pase de + //2.0*pi + sal = signo*(aux-floor(aux/dosPi)*dosPi); + } + else + { + //el valor de entrada no cambia + sal = angulo; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return sal; +} +/******************************************************************************/ +/******************************************************************************/ void BuscaSegmento1DInc(const double valor, const double* lista, const size_t nDatos, @@ -171,7 +231,7 @@ //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la fila y comprobamos si es el extremo S - *fil = f-1-(size_t)((yPto-yMin)/pasoY); + *fil = (size_t)(fabs(yPto-yMax)/pasoY); if(*fil==(f-1)) { //retrasamos una fila @@ -191,13 +251,250 @@ } /******************************************************************************/ /******************************************************************************/ +double Minimo(const double* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como el máximo valor para un double + double salida=DBL_MAX; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(min:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(min:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es menor que el considerado menor + if(lista[pos]<salida) + { + //asignamos el nuevo valor menor + salida = lista[pos]; + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +double Maximo(const double* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como el mínimo valor para un double + double salida=DBL_MIN; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(max:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(max:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es mayor que el considerado mayor + if(lista[pos]>salida) + { + //asignamos el nuevo valor menor + salida = lista[pos]; + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +double MinimoAbs(const double* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como el máximo valor para un double + double salida=DBL_MAX; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(min:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(min:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es menor que el considerado menor + if(fabs(lista[pos])<salida) + { + //asignamos el nuevo valor menor + salida = fabs(lista[pos]); + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +double MaximoAbs(const double* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como 0.0 (trabajamos en valor absoluto) + double salida=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(max:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(max:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es mayor que el considerado mayor + if(fabs(lista[pos])>salida) + { + //asignamos el nuevo valor menor + salida = fabs(lista[pos]); + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +size_t MinimoSizeT(const size_t* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como el máximo valor para un size_t + size_t salida=SIZE_MAX; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(min:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(min:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es menor que el considerado menor + if(lista[pos]<salida) + { + //asignamos el nuevo valor menor + salida = lista[pos]; + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +size_t MaximoSizeT(const size_t* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como 0 (size_t es sólo positivo) + size_t salida=0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(max:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(max:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es mayor que el considerado mayor + if(lista[pos]>salida) + { + //asignamos el nuevo valor menor + salida = lista[pos]; + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ void MinMax(const double* lista, const size_t nDatos, + const size_t incDatos, size_t* posMin, size_t* posMax) { //índice para recorrer bucles size_t i=0; + //variable de posición + size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //consideramos que el primer elemento es el mayor y el menor @@ -206,14 +503,16 @@ //recorremos el resto de elementos de la lista for(i=1;i<nDatos;i++) { + //posición del elemento a comprobar + pos = i*incDatos; //comprobamos si el elemento actual es menor que el considerado menor - if(lista[i]<lista[*posMin]) + if(lista[pos]<lista[(*posMin)*incDatos]) { //asignamos la nueva posición *posMin = i; } //comprobamos si el elemento actual es mayor que el considerado mayor - if(lista[i]>lista[*posMax]) + if(lista[pos]>lista[(*posMax)*incDatos]) { //asignamos la nueva posición *posMax = i; @@ -228,11 +527,14 @@ /******************************************************************************/ void MinMaxAbs(const double* lista, const size_t nDatos, + const size_t incDatos, size_t* posMin, size_t* posMax) { //índice para recorrer bucles size_t i=0; + //variable de posición + size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //consideramos que el primer elemento es el mayor y el menor @@ -241,14 +543,16 @@ //recorremos el resto de elementos de la lista for(i=1;i<nDatos;i++) { + //posición del elemento a comprobar + pos = i*incDatos; //comprobamos si el elemento actual es menor que el considerado menor - if(fabs(lista[i])<fabs(lista[*posMin])) + if(fabs(lista[pos])<fabs(lista[(*posMin)*incDatos])) { //asignamos la nueva posición *posMin = i; } //comprobamos si el elemento actual es mayor que el considerado mayor - if(fabs(lista[i])>fabs(lista[*posMax])) + if(fabs(lista[pos])>fabs(lista[(*posMax)*incDatos])) { //asignamos la nueva posición *posMax = i; @@ -263,11 +567,14 @@ /******************************************************************************/ void MinMaxSizeT(const size_t* lista, const size_t nDatos, + const size_t incDatos, size_t* posMin, size_t* posMax) { //índice para recorrer bucles size_t i=0; + //variable de posición + size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //consideramos que el primer elemento es el mayor y el menor @@ -276,14 +583,16 @@ //recorremos el resto de elementos de la lista for(i=1;i<nDatos;i++) { + //posición del elemento a comprobar + pos = i*incDatos; //comprobamos si el elemento actual es menor que el considerado menor - if(lista[i]<lista[*posMin]) + if(lista[pos]<lista[(*posMin)*incDatos]) { //asignamos la nueva posición *posMin = i; } //comprobamos si el elemento actual es mayor que el considerado mayor - if(lista[i]>lista[*posMax]) + if(lista[pos]>lista[(*posMax)*incDatos]) { //asignamos la nueva posición *posMax = i; @@ -363,22 +672,6 @@ } /******************************************************************************/ /******************************************************************************/ -double GeocNan(void) -{ - //devolvemos el valor de NaN - //le calculamos el valor absoluto porque, en algunos sistemas, al imprimir - //un valor GEOC_NAN normal, éste sale con un signo negativo delante - return fabs(GEOC_NAN); -} -/******************************************************************************/ -/******************************************************************************/ -int EsGeocNan(const double valor) -{ - //comparamos y salimos de la función - return valor!=valor; -} -/******************************************************************************/ -/******************************************************************************/ size_t* PosRepeEnVector(const double* datos, const size_t nDatos, const size_t incDatos, @@ -497,4 +790,91 @@ } /******************************************************************************/ /******************************************************************************/ +void EscalaYTrasladaVector(double* vector, + const size_t nElem, + const size_t inc, + const double escala, + const double traslada) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //distinguimos entre incremento igual a 1 o mayor + if(inc==1) + { + //recorremos los elementos del vector + for(i=0;i<nElem;i++) + { + //primero factor de escala y luego traslación + vector[i] = vector[i]*escala+traslada; + } + } + else + { + //recorremos los elementos del vector + for(i=0;i<nElem;i++) + { + //posición en el vector de trabajo + pos = i*inc; + //primero factor de escala y luego traslación + vector[pos] = vector[pos]*escala+traslada; + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return; +} +/******************************************************************************/ +/******************************************************************************/ +void TrasladaYEscalaVector(double* vector, + const size_t nElem, + const size_t inc, + const double escala, + const double traslada) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //distinguimos entre incremento igual a 1 o mayor + if(inc==1) + { + //recorremos los elementos del vector + for(i=0;i<nElem;i++) + { + //primero traslación y luego factor de escala + vector[i] = (vector[i]+traslada)*escala; + } + } + else + { + //recorremos los elementos del vector + for(i=0;i<nElem;i++) + { + //posición en el vector de trabajo + pos = i*inc; + //primero traslación y luego factor de escala + vector[pos] = (vector[pos]+traslada)*escala; + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return; +} +/******************************************************************************/ +/******************************************************************************/ /** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Added: trunk/octave-forge/main/geometry/inst/octclip/src/geocnan.c =================================================================== --- trunk/octave-forge/main/geometry/inst/octclip/src/geocnan.c (rev 0) +++ trunk/octave-forge/main/geometry/inst/octclip/src/geocnan.c 2012-10-01 10:34:50 UTC (rev 11095) @@ -0,0 +1,184 @@ +/* -*- coding: utf-8 -*- */ +/** +\ingroup geocnan geom matriz gshhs +@{ +\file geocnan.c +\brief Definición de funciones para el trabajo con constantes Not-a-Number. +\author José Luis García Pallero, jgp...@gm... +\date 26 de mayo de 2011 +\version 1.0 +\section Licencia Licencia +Copyright (c) 2010-2011, José Luis García Pallero. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or +... [truncated message content] |
From: <jgp...@us...> - 2012-10-01 10:14:34
|
Revision: 11094 http://octave.svn.sourceforge.net/octave/?rev=11094&view=rev Author: jgpallero Date: 2012-10-01 10:14:28 +0000 (Mon, 01 Oct 2012) Log Message: ----------- Add LDFLAGS to compilation order in OctPROJ Modified Paths: -------------- trunk/octave-forge/main/octproj/src/Makefile Modified: trunk/octave-forge/main/octproj/src/Makefile =================================================================== --- trunk/octave-forge/main/octproj/src/Makefile 2012-10-01 09:15:16 UTC (rev 11093) +++ trunk/octave-forge/main/octproj/src/Makefile 2012-10-01 10:14:28 UTC (rev 11094) @@ -13,7 +13,7 @@ #Flags for the linker LDFLAGS=-lproj #Export flags for compilers and linker -export CFLAGS CXXFLAGS LDFLAGS +export CFLAGS CXXFLAGS .PHONY: all all: compile clean @@ -21,11 +21,11 @@ .PHONY: compile compile: $(CC) -c -v projwrap.c -o projwrap.o - $(CC) -s -v _op_transform.cc projwrap.o - $(CC) -s _op_fwd.cc projwrap.o - $(CC) -s _op_inv.cc projwrap.o - $(CC) -s _op_geod2geoc.cc - $(CC) -s _op_geoc2geod.cc + $(CC) -s -v _op_transform.cc projwrap.o $(LDFLAGS) + $(CC) -s _op_fwd.cc projwrap.o $(LDFLAGS) + $(CC) -s _op_inv.cc projwrap.o $(LDFLAGS) + $(CC) -s _op_geod2geoc.cc $(LDFLAGS) + $(CC) -s _op_geoc2geod.cc $(LDFLAGS) .PHONY: clean clean: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jgp...@us...> - 2012-10-01 09:15:30
|
Revision: 11093 http://octave.svn.sourceforge.net/octave/?rev=11093&view=rev Author: jgpallero Date: 2012-10-01 09:15:16 +0000 (Mon, 01 Oct 2012) Log Message: ----------- Update OctCLIP to version 1.0.2 and OctPROJ to version 1.1.1 Modified Paths: -------------- trunk/octave-forge/main/octclip/ChangeLog trunk/octave-forge/main/octclip/DESCRIPTION trunk/octave-forge/main/octclip/doc/octclip.pdf trunk/octave-forge/main/octclip/doc/octclip.tex trunk/octave-forge/main/octclip/inst/oc_polybool.m trunk/octave-forge/main/octclip/src/Makefile trunk/octave-forge/main/octclip/src/_oc_polybool.cc trunk/octave-forge/main/octclip/src/compilador.c trunk/octave-forge/main/octclip/src/errores.c trunk/octave-forge/main/octclip/src/eucli.c trunk/octave-forge/main/octclip/src/fgeneral.c trunk/octave-forge/main/octclip/src/greiner.c trunk/octave-forge/main/octclip/src/libgeoc/compilador.h trunk/octave-forge/main/octclip/src/libgeoc/constantes.h trunk/octave-forge/main/octclip/src/libgeoc/errores.h trunk/octave-forge/main/octclip/src/libgeoc/eucli.h trunk/octave-forge/main/octclip/src/libgeoc/fgeneral.h trunk/octave-forge/main/octclip/src/libgeoc/general.h trunk/octave-forge/main/octclip/src/libgeoc/geom.h trunk/octave-forge/main/octclip/src/libgeoc/greiner.h trunk/octave-forge/main/octclip/src/libgeoc/polig.h trunk/octave-forge/main/octclip/src/libgeoc/ptopol.h trunk/octave-forge/main/octclip/src/libgeoc/segmento.h trunk/octave-forge/main/octclip/src/libgeoc/ventorno.h trunk/octave-forge/main/octclip/src/polig.c trunk/octave-forge/main/octclip/src/ptopol.c trunk/octave-forge/main/octclip/src/segmento.c trunk/octave-forge/main/octclip/src/ventorno.c trunk/octave-forge/main/octproj/ChangeLog trunk/octave-forge/main/octproj/DESCRIPTION trunk/octave-forge/main/octproj/doc/octproj.pdf trunk/octave-forge/main/octproj/doc/octproj.tex trunk/octave-forge/main/octproj/src/Makefile Added Paths: ----------- trunk/octave-forge/main/octclip/src/calctopo.c trunk/octave-forge/main/octclip/src/dpeucker.c trunk/octave-forge/main/octclip/src/geocnan.c trunk/octave-forge/main/octclip/src/geocomp.c trunk/octave-forge/main/octclip/src/libgeoc/calctopo.h trunk/octave-forge/main/octclip/src/libgeoc/dpeucker.h trunk/octave-forge/main/octclip/src/libgeoc/geocnan.h trunk/octave-forge/main/octclip/src/libgeoc/geocomp.h trunk/octave-forge/main/octclip/src/libgeoc/polil.h trunk/octave-forge/main/octclip/src/libgeoc/recpolil.h trunk/octave-forge/main/octclip/src/polil.c trunk/octave-forge/main/octclip/src/recpolil.c Modified: trunk/octave-forge/main/octclip/ChangeLog =================================================================== --- trunk/octave-forge/main/octclip/ChangeLog 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/ChangeLog 2012-10-01 09:15:16 UTC (rev 11093) @@ -1,8 +1,93 @@ +2012-10-01 José Luis García Pallero <jgp...@gm...> + + * DESCRIPTION: + Update version number and date in DESCRIPTION file + [f06e99c0b026] [tip] + + * .hgtags: + Version 1.0.2 + [a38b95e66500] + + * doc/octclip.pdf, doc/octclip.tex: + Update documentation + [2310bc775bea] [OctCLIP-1.0.2] + +2012-09-30 José Luis García Pallero <jgp...@gm...> + + * inst/oc_polybool.m, src/_oc_polybool.cc: + Fix function help text + [ca8c9ba38288] + + * src/Makefile: + Supression of compiler flag not common to all archs + [e5d734f4c6d0] + +2012-04-17 José Luis García Pallero <jgp...@gm...> + + * src/Makefile: + Changes in src/Makefile in ordert to pass warning and optimisation + flags to mkoctfile + [ec407713d9ac] + + * .hgignore: + Update .hgignore file in mercurial repo + [e493dfb8efb7] + +2012-04-13 José Luis García Pallero <jgp...@gm...> + + * doc/octclip.pdf, doc/octclip.tex: + Change author's affiliation and dates in the reference manual + [6292fc806330] + +2011-11-21 José Luis García Pallero <jgp...@gm...> + + * .hgtags: + Version 1.0.1 + [c77ff2bf09d4] + + * DESCRIPTION: + Change version number and date + [406c40e732a5] [OctCLIP-1.0.1] + + * src/_oc_polybool.cc: + Minor changes due to changes in the Greiner-Hormann API + [ecd2084e9cea] + + * src/Makefile: + Update Makefile with the new files + [9c07e48ee665] + + * src/calctopo.c, src/compilador.c, src/dpeucker.c, src/errores.c, + src/eucli.c, src/fgeneral.c, src/geocnan.c, src/geocomp.c, + src/greiner.c, src/libgeoc/calctopo.h, src/libgeoc/compilador.h, + src/libgeoc/constantes.h, src/libgeoc/dpeucker.h, + src/libgeoc/errores.h, src/libgeoc/eucli.h, src/libgeoc/fgeneral.h, + src/libgeoc/general.h, src/libgeoc/geocnan.h, src/libgeoc/geocomp.h, + src/libgeoc/geom.h, src/libgeoc/greiner.h, src/libgeoc/polig.h, + src/libgeoc/polil.h, src/libgeoc/ptopol.h, src/libgeoc/recpolil.h, + src/libgeoc/segmento.h, src/libgeoc/ventorno.h, src/polig.c, + src/polil.c, src/ptopol.c, src/recpolil.c, src/segmento.c, + src/ventorno.c: + Add changes and new files fron the original source of my Greiner- + Hormann implementation. OctCLIP code comes from a personal library + not yet published + [fccf93621aa8] + +2011-06-12 José Luis García Pallero <jgp...@gm...> + + * doc/octclip.pdf, doc/octclip.tex: + LaTeX documentation update + [9c92a3d8fd20] + 2011-06-07 José Luis García Pallero <jgp...@gm...> + * inst/oc_polybool.m: + Fix documentation + [f970d69207fd] + * INDEX: Remove test_octclip from 'INDEX' file - [5e2dd1fd23fc] [tip] + [5e2dd1fd23fc] * inst/oc_polybool.m: Add the content of old 'test_octclip.m' program into 'oc_polybool.m' Modified: trunk/octave-forge/main/octclip/DESCRIPTION =================================================================== --- trunk/octave-forge/main/octclip/DESCRIPTION 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/DESCRIPTION 2012-10-01 09:15:16 UTC (rev 11093) @@ -1,8 +1,8 @@ Name: OctCLIP -Version: 1.0.0 -Date: 2011-03-01 -Author: José Luis García Pallero <jgp...@gm...> -Maintainer: José Luis García Pallero <jgp...@gm...> +Version: 1.0.2 +Date: 2012-10-01 +Author: José Luis García Pallero, <jgp...@gm...> +Maintainer: José Luis García Pallero, <jgp...@gm...> Title: GNU Octave clipping polygons tool Description: This package allows to do boolean operations with polygons using the Greiner-Hormann algorithm. Modified: trunk/octave-forge/main/octclip/doc/octclip.pdf =================================================================== (Binary files differ) Modified: trunk/octave-forge/main/octclip/doc/octclip.tex =================================================================== --- trunk/octave-forge/main/octclip/doc/octclip.tex 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/doc/octclip.tex 2012-10-01 09:15:16 UTC (rev 11093) @@ -9,10 +9,12 @@ \title{Clipping polygons from \octave\footnote{This document is distributed under the terms of the GNU Free Documentation License. Please, see \url{http://www.gnu.org/licenses/}}} -\author{Jos\'e Luis Garc\'ia Pallero\footnote{Instituto de Astronom\'ia y - Geodesia, Fac. de CC Matem\'aticas, Universidad Complutense de Madrid. - \texttt{jlg...@pd...}, \texttt{jgp...@gm...}}} -\date{\today} +\author{Jos\'e Luis Garc\'ia Pallero\footnote{ETSI en Topograf\'ia, Geodesia y + Cartograf\'ia, Universidad Polit\'ecnica de Madrid. + \texttt{jlg...@up...}, \texttt{jgp...@gm...}}} +\date{October 1, 2012 (version 1.0.2)\\ + November 21, 2011 (version 1.0.1)\\ + May 24, 2011 (version 1.0.0)} \begin{document} \maketitle @@ -32,22 +34,22 @@ \section{Overview} The \octclip{} package allows you to perform boolean operations (intersection, -union and difference) between two polygons in \octave{} using the +union, difference and exclusive or) between two polygons in \octave{} using the Greiner-Hormann algorithm\footnote{\cite{greiner1998} and \url{http://davis.wpi.edu/~matt/courses/clipping/}}. Greiner-Hormann is an efficient algorithm for clipping arbitrary 2D polygons. -The algorithm can handle arbitrary closed polygons, specifically where the +The algorithm can handle arbitrary closed polygons, specifically where the subject and clip polygons may self-intersect. \section{Installation} -As several \octave{} packages, \octclip{} installation consists in compiling the +As most of \octave{} packages, \octclip{} installation consists in compiling the C++ kernel sources, link them against \octave{} library to generate \texttt{*.oct} functions and copy this \texttt{*.oct} executables and other \texttt{*.m} functions into a working directory. -The automatic procedure can be easily done by running the command: +The automagic procedure can be easily done by running the command: \begin{verbatim} octave:1> pkg install octclip-x.x.x.tar.gz @@ -71,7 +73,7 @@ The function is: \begin{itemize} -\item \texttt{\_oc\_polybool}: boolean operation between two polygons. +\item \texttt{\_oc\_polybool}: Performs boolean operation between two polygons. \end{itemize} \subsection{\texttt{*.m} function} @@ -83,21 +85,21 @@ The function is the same as in section \ref{op-of} (without the \texttt{\_} at the beginning of the name): \begin{itemize} -\item \texttt{oc\_polybool}: calls \texttt{\_oc\_polybool}. +\item \texttt{oc\_polybool}: Performs boolean operation between two polygons + by calling the \texttt{\_oc\_polybool}. \end{itemize} -A test script for the package exists too: +\texttt{oc\_polybool} includes too some demonstration code in order to test the +functionality of the functions. The demo code can be executed as: +\begin{verbatim} +octave:1> demo oc_polybool +\end{verbatim} -\begin{itemize} -\item \texttt{test\_octclip}: plots an example of the \texttt{oc\_polybool} - usage. -\end{itemize} - \subsection{Error handling} -\texttt{*.oct} and \texttt{*.m} functions can emit errors, some due to errors in -input arguments and other due to errors in functions from the C\footnote{The -algorithm is internally implemented in C (C99 standard).} code. +\texttt{*.oct} and \texttt{*.m} functions can emit errors, some due to errors +with input arguments and other due to errors in functions from the +C\footnote{The algorithm is internally implemented in C (C99 standard).} code. Errors due to wrong input arguments (data types, dimensions, etc.) can be only given for \texttt{*.m} function and this is the reason because the use of this @@ -108,7 +110,7 @@ arguments, wrong value of the operation identifier and internal errors of memory allocation. -\section{Caveats} +\section{Caveats of Greiner-Hormann algorithm} To do. @@ -116,6 +118,12 @@ To do. +\section{Notes} + +Apart from \url{http://octave.sourceforge.net/octclip/index.html}, an up to date +version of \octclip{} can be downloaded from +\url{https://bitbucket.org/jgpallero/octclip/}. + % \subsection{Geodetic to geocentric and vice versa} % % \begin{verbatim} Modified: trunk/octave-forge/main/octclip/inst/oc_polybool.m =================================================================== --- trunk/octave-forge/main/octclip/inst/oc_polybool.m 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/inst/oc_polybool.m 2012-10-01 09:15:16 UTC (rev 11093) @@ -17,8 +17,8 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn{Function File}{[@var{X},@var{Y},@var{nPol},@var{nInt},@var{nPert}] =}_oc_polybool(@var{sub},@var{clip},@var{op}) -## @deftypefnx{Function File}{[@var{X},@var{Y},@var{nPol},@var{nInt},@var{nPert}] =}_oc_polybool(@var{sub},@var{clip}) +## @deftypefn{Function File}{[@var{X},@var{Y},@var{nPol},@var{nInt},@var{nPert}] =}oc_polybool(@var{sub},@var{clip},@var{op}) +## @deftypefnx{Function File}{[@var{X},@var{Y},@var{nPol},@var{nInt},@var{nPert}] =}oc_polybool(@var{sub},@var{clip}) ## ## This function performs boolean operations between two polygons using the ## Greiner-Hormann algorithm (http://davis.wpi.edu/~matt/courses/clipping/). @@ -47,11 +47,11 @@ ## be repeated at the end (but is permitted). Pairs of (NaN,NaN) coordinates in ## @var{sub} and/or @var{clip} are ommitted. ## -## @var{X} is a column vector containing the X coordinates of the vertices for. -## resultant polygon(s). +## @var{X} is a column vector containing the X coordinates of the vertices of +## the resultant polygon(s). ## -## @var{Y} is a column vector containing the Y coordinates of the vertices for. -## resultant polygon(s). +## @var{Y} is a column vector containing the Y coordinates of the vertices of +## the resultant polygon(s). ## ## @var{nPol} is the number of output polygons. ## Modified: trunk/octave-forge/main/octclip/src/Makefile =================================================================== --- trunk/octave-forge/main/octclip/src/Makefile 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/src/Makefile 2012-10-01 09:15:16 UTC (rev 11093) @@ -1,22 +1,44 @@ # -*- coding: utf-8 -*- +#Compiler CC=mkoctfile +#Common warning flags for C and C++ +FLAGSCOMW=-Wall -Wextra -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings +#Common optimization flags for C and C++ +FLAGSCOMO=-O2 -funroll-loops -fno-common -fshort-enums +#Flags for C +CFLAGS=-std=c99 -pedantic $(FLAGSCOMW) -Wconversion -Wmissing-prototypes +CFLAGS+=-Wstrict-prototypes -Wnested-externs $(FLAGSCOMO) +#Flags for C++ +CXXFLAGS=$(FLAGSCOMW) $(FLAGSCOMO) +#Export flags for compilers and linker +export CFLAGS CXXFLAGS .PHONY: all all: compile clean .PHONY: compile compile: - $(CC) -c -Wall -Wextra -I. compilador.c -o compilador.o - $(CC) -c -Wall -Wextra -I. errores.c -o errores.o - $(CC) -c -Wall -Wextra -I. eucli.c -o eucli.o - $(CC) -c -Wall -Wextra -I. fgeneral.c -o fgeneral.o - $(CC) -c -Wall -Wextra -I. greiner.c -o greiner.o - $(CC) -c -Wall -Wextra -I. polig.c -o polig.o - $(CC) -c -Wall -Wextra -I. ptopol.c -o ptopol.o - $(CC) -c -Wall -Wextra -I. segmento.c -o segmento.o - $(CC) -c -Wall -Wextra -I. ventorno.c -o ventorno.o - $(CC) -s -Wall -Wextra -I. _oc_polybool.cc *.o + $(CC) -c -I. calctopo.c -o calctopo.o + $(CC) -c -I. compilador.c -o compilador.o + $(CC) -c -I. dpeucker.c -o dpeucker.o + $(CC) -c -I. errores.c -o errores.o + $(CC) -c -I. eucli.c -o eucli.o + $(CC) -c -I. fgeneral.c -o fgeneral.o + $(CC) -c -I. geocnan.c -o geocnan.o + $(CC) -c -I. geocomp.c -o geocomp.o + $(CC) -c -I. greiner.c -o greiner.o + $(CC) -c -I. polig.c -o polig.o + $(CC) -c -I. polil.c -o polil.o + $(CC) -c -I. ptopol.c -o ptopol.o + $(CC) -c -I. recpolil.c -o recpolil.o + $(CC) -c -I. segmento.c -o segmento.o + $(CC) -c -I. ventorno.c -o ventorno.o + $(CC) -s -I. _oc_polybool.cc *.o .PHONY: clean clean: rm -rf *.o *~ + +.PHONY: cleanall +cleanall: + rm -rf *~ *.o *.oct Modified: trunk/octave-forge/main/octclip/src/_oc_polybool.cc =================================================================== --- trunk/octave-forge/main/octclip/src/_oc_polybool.cc 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/src/_oc_polybool.cc 2012-10-01 09:15:16 UTC (rev 11093) @@ -51,10 +51,10 @@ be repeated at the end (but is permitted). Pairs of (NaN,NaN) coordinates in\n\ @var{sub} and/or @var{clip} are ommitted.\n\ \n\ -@var{X} is a column vector containing the X coordinates of the vertices for.\n\ -resultant polygon(s).\n\n\ -@var{Y} is a column vector containing the Y coordinates of the vertices for.\n\ -resultant polygon(s).\n\n\ +@var{X} is a column vector containing the X coordinates of the vertices of\n\ +the resultant polygon(s).\n\n\ +@var{Y} is a column vector containing the Y coordinates of the vertices of\n\ +the resultant polygon(s).\n\n\ @var{nPol} is the number of output polygons.\n\n\ @var{nInt} is the number of intersections between @var{sub} and @var{clip}.\n\n\ @var{nPert} is the number of perturbed points of the @var{clip} polygon in\n\ @@ -117,7 +117,7 @@ //operation identifier enum GEOC_OP_BOOL_POLIG op=GeocOpBoolInter; //output struct - poligGreiner* result=NULL; + polig* result=NULL; //number of polygons, intersections and perturbations size_t nPol=0,nInter=0,nPert=0; //number of elements for the output vectors @@ -231,7 +231,7 @@ //free memory LibMemPoliClip(polA); LibMemPoliClip(polB); - LibMemPoligGreiner(result); + LibMemPolig(result); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// Added: trunk/octave-forge/main/octclip/src/calctopo.c =================================================================== --- trunk/octave-forge/main/octclip/src/calctopo.c (rev 0) +++ trunk/octave-forge/main/octclip/src/calctopo.c 2012-10-01 09:15:16 UTC (rev 11093) @@ -0,0 +1,71 @@ +/* -*- coding: utf-8 -*- */ +/** +\ingroup geodesia geom +@{ +\file calctopo.c +\brief Definición de funciones para cálculos de topografía. +\author José Luis García Pallero, jgp...@gm... +\date 05 de julio de 2011 +\section Licencia Licencia +Copyright (c) 2011, José Luis García Pallero. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name of the copyright holders nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/******************************************************************************/ +/******************************************************************************/ +#include"libgeoc/calctopo.h" +/******************************************************************************/ +/******************************************************************************/ +double AcimutTopografico(const double x1, + const double y1, + const double x2, + const double y2) +{ + //acimut calculado + double acimut=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos el acimut en el dominio [-pi pi] + acimut = atan2(x2-x1,y2-y1); + //comprobamos si ha salido un valor negativo + if(acimut<0.0) + { + //metemos el valor en dominio + acimut += 2.0*GEOC_CONST_PI; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return acimut; +} +/******************************************************************************/ +/******************************************************************************/ +/** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Modified: trunk/octave-forge/main/octclip/src/compilador.c =================================================================== --- trunk/octave-forge/main/octclip/src/compilador.c 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/src/compilador.c 2012-10-01 09:15:16 UTC (rev 11093) @@ -73,3 +73,10 @@ /******************************************************************************/ /******************************************************************************/ /** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Added: trunk/octave-forge/main/octclip/src/dpeucker.c =================================================================== --- trunk/octave-forge/main/octclip/src/dpeucker.c (rev 0) +++ trunk/octave-forge/main/octclip/src/dpeucker.c 2012-10-01 09:15:16 UTC (rev 11093) @@ -0,0 +1,472 @@ +/* -*- coding: utf-8 -*- */ +/** +\ingroup geom +@{ +\file dpeucker.c +\brief Definición de funciones para el aligerado de polilíneas basadas en el + algoritmo de Douglas-Peucker. +\author José Luis García Pallero, jgp...@gm... +\date 04 de julio de 2011 +\section Licencia Licencia +Copyright (c) 2011, José Luis García Pallero. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name of the copyright holders nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/******************************************************************************/ +/******************************************************************************/ +#include"libgeoc/dpeucker.h" +/******************************************************************************/ +/******************************************************************************/ +size_t* AligeraPolilinea(const double* x, + const double* y, + const size_t nPtos, + const size_t incX, + const size_t incY, + const double tol, + const enum GEOC_DPEUCKER_ROBUSTO robusto, + const size_t nPtosRobusto, + const size_t nSegRobusto, + size_t* nPtosSal) +{ + //índice para recorrer bucles + size_t p=0; + //índice de los puntos de trabajo + size_t i=0,j=0,k=0; + //coordenadas de trabajo + double xIni=0.0,yIni=0.0,xFin=0.0,yFin=0.0,xTrab=0.0,yTrab=0.0; + //altura del triángulo de trabajo + double h=0.0; + //variable indicadora de punto a mantener + int usado=0; + //número de elementos de trabajo internos del vector de salida + size_t nElem=0; + //vector de salida + size_t* sal=NULL; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //iniciamos la variable de salida de número de puntos a 0 + *nPtosSal = 0; + //comprobamos casos especiales de nPtos + if(nPtos==0) + { + //salimos de la función con NULL + return NULL; + } + else if(nPtos<=2) + { + //asignamos el número de puntos usados + *nPtosSal = nPtos; + //asignamos memoria para el vector de salida + sal = (size_t*)malloc((*nPtosSal)*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + //asignamos valores al vector de salida + for(i=0;i<(*nPtosSal);i++) + { + //asignamos el índice de trabajo + sal[i] = i; + } + //salimos de la función + return sal; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //inicializamos el indicador interno de tamaño del vector + nElem = GEOC_DPEUCKER_BUFFER_PTOS; + //asignamos memoria para el vector de salida + sal = (size_t*)malloc(nElem*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + //indicamos que el primer punto siempre se usa + *nPtosSal = 1; + sal[0] = 0; + //puntos de trabajo para iniciar los cálculos + i = 0; + j = 1; + k = 2; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //entramos en un bucle infinito + while(1) + { + //comprobamos si hay que salir del bucle + if(k>(nPtos-1)) + { + //salimos del bucle + break; + } + //coordenadas de la base del triángulo + xIni = x[i*incX]; + yIni = y[i*incY]; + xFin = x[k*incX]; + yFin = y[k*incY]; + //inicializamos a 0 la variable de punto usado + usado = 0; + //recorremos los puntos a testear + for(p=j;p<k;p++) + { + //coordenadas del vértice del triángulo + xTrab = x[p*incX]; + yTrab = y[p*incY]; + //calculamos la altura del triángulo + h = AlturaTriangulo(xTrab,yTrab,xIni,yIni,xFin,yFin); + //comprobamos si la altura supera a la tolerancia + if(h>tol) + { + //indicamos que el punto ha sido usado + usado = 1; + //comprobamos si se utiliza el algoritmo robusto + if(robusto!=GeocDPeuckerRobNo) + { + //comprobamos si hay que aplicar el algoritmo de + //intersección con puntos originales + if((robusto==GeocDPeuckerRobSi)|| + (robusto==GeocDPeuckerRobOrig)) + { + //aplicamos el algoritmo + AligPolilRobIntersecOrig(x,y,nPtos,incX,incY, + nPtosRobusto,i,&p); + } + //comprobamos si hay que aplicar el algoritmo de auto + //intersección + if((robusto==GeocDPeuckerRobSi)|| + (robusto==GeocDPeuckerRobAuto)) + { + //indicamos un número de puntos para el vector de salida + //una unidad menor que el número realmente almacenado + //para evitar el segmento inmediatamente anterior al que + //vamos a crear + AligPolilRobAutoIntersec(x,y,incX,incY,sal, + (*nPtosSal)-1,nSegRobusto,i, + &p); + } + } + //añadimos al contador este nuevo punto + (*nPtosSal)++; + //comprobamos si hay que reasignar memoria + if((*nPtosSal)>nElem) + { + //añadimos otro grupo de puntos + nElem += GEOC_DPEUCKER_BUFFER_PTOS; + //asignamos memoria para el vector de salida + sal = (size_t*)realloc(sal,nElem*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + } + //añadimos el nuevo punto usado + sal[(*nPtosSal)-1] = p; + //actualizamos los índices de los puntos de trabajo + i = p; + j = i+1; + k = j+1; + //salimos del bucle + break; + } + } + //comprobamos si no se ha utilizado ninguno de los vértices candidatos + if(!usado) + { + //pasamos al siguiente punto como extremo del segmento + k++; + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //comprobamos si el último punto se ha añadido + if(sal[(*nPtosSal)-1]!=(nPtos-1)) + { + //añadimos al contador el último punto + (*nPtosSal)++; + //comprobamos si hay que reasignar memoria + if((*nPtosSal)>nElem) + { + //añadimos otro grupo de puntos + nElem += GEOC_DPEUCKER_BUFFER_PTOS; + //asignamos memoria para el vector de salida + sal = (size_t*)realloc(sal,nElem*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + } + //asignamos el último punto + sal[(*nPtosSal)-1] = nPtos-1; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //comprobamos si el vector de salida tiene demasiada memoria asignada + if(nElem>(*nPtosSal)) + { + //ajustamos el tamaño del vector de salida + sal = (size_t*)realloc(sal,(*nPtosSal)*sizeof(size_t)); + //comprobamos los posibles errores + if(sal==NULL) + { + //mensaje de error + GEOC_ERROR("Error de asignación de memoria"); + //salimos de la función + return NULL; + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return sal; +} +/******************************************************************************/ +/******************************************************************************/ +void AligPolilRobIntersecOrig(const double* x, + const double* y, + const size_t nPtos, + const size_t incX, + const size_t incY, + const size_t ptosAUsar, + const size_t posIni, + size_t* posFin) +{ + //índices para recorrer bucles + size_t i=0,j=0; + //coordenadas de trabajo + double xA=0.0,yA=0.0,xB=0.0,yB=0.0,xC=0.0,yC=0.0,xD=0.0,yD=0.0; + //punto de parada para comprobar la intersección de segmentos + size_t parada=0; + //identificador de intersección + int inter=0; + //variables auxiliares + size_t aux=0; + double xAux=0.0,yAux=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //contemplamos una posible salida rápida + if((*posFin)<=(posIni+1)) + { + //salimos de la función + return; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos el número de puntos que quedan hasta el final de los vectores + //de coordenadas desde la posición de fin de segmento (contándola) + aux = nPtos-(*posFin); + //calculamos el punto de parada para la intersección de segmentos + if((aux>ptosAUsar)&&(ptosAUsar!=0)) + { + //paramos en un pnto tal que usemos ptosAUsar puntos + parada = *posFin+ptosAUsar-1; + } + else + { + //paramos en el penúltimo punto + parada = nPtos-2; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //las coordenadas del punto inicial del segmento base no cambian nunca + xA = x[posIni*incX]; + yA = y[posIni*incY]; + //recorremos los puntos candidatos hasta el anterior al punto base + for(i=(*posFin);i>posIni;i--) + { + //comprobamos si estamos ante el punto posterior al inicial + if(i==(posIni+1)) + { + //terminamos, porque este punto es el siguiente al punto base en el + //listado original + *posFin = i; + //salimos del bucle + break; + } + else + { + //coordenadas de los puntos inicial y final del segmento base + xB = x[i*incX]; + yB = y[i*incY]; + //recorremos los puntos posteriores hasta el de parada + for(j=i;j<=parada;j++) + { + //coordenadas de los puntos inicial y final del siguiente + //segmento + xC = x[j*incX]; + yC = y[j*incY]; + xD = x[(j+1)*incX]; + yD = y[(j+1)*incY]; + //calculamos la intersección entre los segmentos + inter = IntersecSegmentos2D(xA,yA,xB,yB,xC,yC,xD,yD,&xAux, + &yAux); + //comprobamos si hay intersección entre los segmentos + if(inter!=GEOC_SEG_NO_INTERSEC) + { + //salimos del bucle + break; + } + } + //comprobamos si no ha habido ninguna intersección + if(inter==GEOC_SEG_NO_INTERSEC) + { + //indicamos el índice del vértice final + *posFin = i; + //salimos del bucle + break; + } + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return; +} +/******************************************************************************/ +/******************************************************************************/ +void AligPolilRobAutoIntersec(const double* x, + const double* y, + const size_t incX, + const size_t incY, + const size_t* posAlig, + const size_t nPosAlig, + const size_t segAUsar, + const size_t posIni, + size_t* posFin) +{ + //índices para recorrer bucles + size_t i=0,j=0; + //variables de posición + size_t k=0,l=0,pos=0; + //coordenadas de trabajo + double xA=0.0,yA=0.0,xB=0.0,yB=0.0,xC=0.0,yC=0.0,xD=0.0,yD=0.0; + //número de segmentos calculados hasta ahora, excepto el último + size_t nSeg=0; + //identificador de intersección + int inter=0; + //variables auxiliares + double xAux=0.0,yAux=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //contemplamos una posible salida rápida + if(((*posFin)<=(posIni+1))||(nPosAlig<2)) + { + //salimos de la función + return; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos el número de segmentos calculados hasta ahora, excepto el + //anterior al de trabajo + nSeg = nPosAlig-1; + //comprobamos si se usan todos los segmentos o sólo parte + if(segAUsar!=0) + { + //asignamos el número de segmentos a utilizar + nSeg = (nSeg>segAUsar) ? segAUsar : nSeg; + } + //las coordenadas del punto inicial del segmento base no cambian nunca + xA = x[posIni*incX]; + yA = y[posIni*incY]; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //recorremos los puntos candidatos hasta el anterior al punto base + for(i=(*posFin);i>posIni;i--) + { + //comprobamos si estamos ante el punto posterior al inicial + if(i==(posIni+1)) + { + //terminamos, porque este punto es el siguiente al punto inicial + *posFin = i; + //salimos del bucle + break; + } + else + { + //coordenadas del punto final del segmento base + xB = x[i*incX]; + yB = y[i*incY]; + //recorremos el número de segmentos de trabajo + for(j=0;j<nSeg;j++) + { + //posición del punto inicial del siguiente segmento anterior + pos = nPosAlig-1-j; + //índices inicial y final del siguiente segmento anterior + k = posAlig[pos]; + l = posAlig[pos-1]; + //puntos inicial y final del siguiente segmento + xC = x[k*incX]; + yC = y[k*incY]; + xD = x[l*incX]; + yD = y[l*incY]; + //calculamos la intersección entre los segmentos + inter = IntersecSegmentos2D(xA,yA,xB,yB,xC,yC,xD,yD,&xAux, + &yAux); + //comprobamos si hay intersección entre los segmentos + if(inter!=GEOC_SEG_NO_INTERSEC) + { + //salimos del bucle + break; + } + } + //comprobamos si no ha habido ninguna intersección + if(inter==GEOC_SEG_NO_INTERSEC) + { + //indicamos el índice del vértice final + *posFin = i; + //salimos del bucle + break; + } + } + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return; +} +/******************************************************************************/ +/******************************************************************************/ +/** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Modified: trunk/octave-forge/main/octclip/src/errores.c =================================================================== --- trunk/octave-forge/main/octclip/src/errores.c 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/src/errores.c 2012-10-01 09:15:16 UTC (rev 11093) @@ -110,3 +110,10 @@ /******************************************************************************/ /******************************************************************************/ /** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Modified: trunk/octave-forge/main/octclip/src/eucli.c =================================================================== --- trunk/octave-forge/main/octclip/src/eucli.c 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/src/eucli.c 2012-10-01 09:15:16 UTC (rev 11093) @@ -8,7 +8,7 @@ \author José Luis García Pallero, jgp...@gm... \date 27 de octubre de 2009 \section Licencia Licencia -Copyright (c) 2009-2010, José Luis García Pallero. All rights reserved. +Copyright (c) 2009-2011, José Luis García Pallero. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -157,4 +157,82 @@ } /******************************************************************************/ /******************************************************************************/ +double AnguloVecPlano(const double x1, + const double y1, + const double x2, + const double y2) +{ + //variables auxiliares + double num=0.0,den=0.0; + //variable de salida + double alfa=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos el numerador de la fórmula que da el coseno del ángulo + num = x1*x2+y1*y2; + //calculamos el denominador de la fórmula que da el coseno del ángulo + den = sqrt((x1*x1+y1*y1)*(x2*x2+y2*y2)); + //calculamos el coseno del ángulo, teniendo en cuenta casos singulares + if(den==0.0) + { + //si el denominador es 0.0, el ángulo es 0.0 y su coseno 1.0 + alfa = 1.0; + } + else + { + //no hay singularidad + alfa = num/den; + } + //calculamos el ángulo + alfa = acos(alfa); + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return alfa; +} +/******************************************************************************/ +/******************************************************************************/ +double AlturaTriangulo(const double xVert, + const double yVert, + const double xBase1, + const double yBase1, + const double xBase2, + const double yBase2) +{ + //ángulo entra la base en el punto 1 y el vértice + double alfa=0.0; + //longitud del punto 1 de la base al vértice + double lon=0.0; + //variables auxiliares + double dxv=0.0,dyv=0.0,dxb=0.0,dyb=0.0; + //variable de salida + double h=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //calculamos los incrementos de coordenadas auxiliares + dxv = xVert-xBase1; + dyv = yVert-yBase1; + dxb = xBase2-xBase1; + dyb = yBase2-yBase1; + //calculamos el ángulo entre la base y el segmento que une el punto inicial + //de ésta con el vértice + alfa = AnguloVecPlano(dxv,dyv,dxb,dyb); + //longitud del lado que une la base con el vértice 1 de la base + lon = sqrt(dxv*dxv+dyv*dyv); + //calculamos la altura + h = fabs(lon*sin(alfa)); + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return h; +} +/******************************************************************************/ +/******************************************************************************/ /** @} */ +/******************************************************************************/ +/******************************************************************************/ +/* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ +/* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ +/* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ +/* kate: backspace-indents on; show-tabs on; */ +/* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ Modified: trunk/octave-forge/main/octclip/src/fgeneral.c =================================================================== --- trunk/octave-forge/main/octclip/src/fgeneral.c 2012-09-24 12:24:31 UTC (rev 11092) +++ trunk/octave-forge/main/octclip/src/fgeneral.c 2012-10-01 09:15:16 UTC (rev 11093) @@ -5,6 +5,7 @@ \file fgeneral.c \brief Definición de funciones de utilidad general. \author José Luis García Pallero, jgp...@gm... +\note Este fichero contiene funciones paralelizadas con OpenMP. \date 10 de octubre de 2009 \version 1.0 \section Licencia Licencia @@ -38,6 +39,65 @@ #include"libgeoc/fgeneral.h" /******************************************************************************/ /******************************************************************************/ +int GeocParOmpFgeneral(char version[]) +{ + //comprobamos si hay paralelización +#if defined(_OPENMP) + //comprobamos si hay que extraer versión + if(version!=NULL) + { + //calculamos la versión + VersionOpenMP(_OPENMP,version); + } + //salimos de la función + return 1; +#else + if(version!=NULL) + { + //utilizamos la variable version para que no dé warming al compilar + strcpy(version,""); + } + //salimos de la función + return 0; +#endif +} +/******************************************************************************/ +/******************************************************************************/ +double PonAnguloDominio(const double angulo) +{ + //signo del ángulo de trabajo + double signo=0.0; + //2.0*pi + double dosPi=2.0*GEOC_CONST_PI; + //variable auxiliar + double aux=angulo; + //variable de salida + double sal=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //sólo trabajamos si el valor de entrada está fuera de los límites + if((angulo<=-dosPi)||(angulo>=dosPi)) + { + //extraemos el signo del ángulo pasado + signo = GEOC_SIGNO(angulo); + //valor absoluto del ángulo pasado + aux = fabs(angulo); + //metemos el ángulo en dominio eliminando la cantidad que se pase de + //2.0*pi + sal = signo*(aux-floor(aux/dosPi)*dosPi); + } + else + { + //el valor de entrada no cambia + sal = angulo; + } + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return sal; +} +/******************************************************************************/ +/******************************************************************************/ void BuscaSegmento1DInc(const double valor, const double* lista, const size_t nDatos, @@ -171,7 +231,7 @@ //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la fila y comprobamos si es el extremo S - *fil = f-1-(size_t)((yPto-yMin)/pasoY); + *fil = (size_t)(fabs(yPto-yMax)/pasoY); if(*fil==(f-1)) { //retrasamos una fila @@ -191,13 +251,250 @@ } /******************************************************************************/ /******************************************************************************/ +double Minimo(const double* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como el máximo valor para un double + double salida=DBL_MAX; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(min:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(min:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es menor que el considerado menor + if(lista[pos]<salida) + { + //asignamos el nuevo valor menor + salida = lista[pos]; + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +double Maximo(const double* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como el mínimo valor para un double + double salida=DBL_MIN; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(max:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(max:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es mayor que el considerado mayor + if(lista[pos]>salida) + { + //asignamos el nuevo valor menor + salida = lista[pos]; + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +double MinimoAbs(const double* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como el máximo valor para un double + double salida=DBL_MAX; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(min:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(min:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es menor que el considerado menor + if(fabs(lista[pos])<salida) + { + //asignamos el nuevo valor menor + salida = fabs(lista[pos]); + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +double MaximoAbs(const double* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como 0.0 (trabajamos en valor absoluto) + double salida=0.0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(max:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(max:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es mayor que el considerado mayor + if(fabs(lista[pos])>salida) + { + //asignamos el nuevo valor menor + salida = fabs(lista[pos]); + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +size_t MinimoSizeT(const size_t* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como el máximo valor para un size_t + size_t salida=SIZE_MAX; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(min:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(min:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es menor que el considerado menor + if(lista[pos]<salida) + { + //asignamos el nuevo valor menor + salida = lista[pos]; + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ +size_t MaximoSizeT(const size_t* lista, + const size_t nDatos, + const size_t incDatos) +{ + //índice para recorrer bucles + size_t i=0; + //variable de posición + size_t pos=0; + //variable de salida, inicializada como 0 (size_t es sólo positivo) + size_t salida=0; + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //paralelización con OpenMP, sólo si la versión es superior a la 3.0 + //en versiones anteriores no existe la posibilidad de usar reduction(max:) +#if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) +#pragma omp parallel for default(none) \ + shared(lista) \ + private(i,pos) \ + reduction(max:salida) +#endif + //recorremos el resto de elementos de la lista + for(i=0;i<nDatos;i++) + { + //posición del elemento a comprobar + pos = i*incDatos; + //comprobamos si el elemento actual es mayor que el considerado mayor + if(lista[pos]>salida) + { + //asignamos el nuevo valor menor + salida = lista[pos]; + } + } // --> fin del #pragma omp parallel for + //////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + //salimos de la función + return salida; +} +/******************************************************************************/ +/******************************************************************************/ void MinMax(const double* lista, const size_t nDatos, + const size_t incDatos, size_t* posMin, size_t* posMax) { //índice para recorrer bucles size_t i=0; + //variable de posición + size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //consideramos que el primer elemento es el mayor y el menor @@ -2... [truncated message content] |
From: <car...@us...> - 2012-09-24 12:24:40
|
Revision: 11092 http://octave.svn.sourceforge.net/octave/?rev=11092&view=rev Author: carandraug Date: 2012-09-24 12:24:31 +0000 (Mon, 24 Sep 2012) Log Message: ----------- bestblk: fix see also Modified Paths: -------------- trunk/octave-forge/main/image/inst/bestblk.m Modified: trunk/octave-forge/main/image/inst/bestblk.m =================================================================== --- trunk/octave-forge/main/image/inst/bestblk.m 2012-09-23 21:17:01 UTC (rev 11091) +++ trunk/octave-forge/main/image/inst/bestblk.m 2012-09-24 12:24:31 UTC (rev 11092) @@ -37,7 +37,7 @@ ## @code{round(min(dimension/10,k/2))} which minimizes padding. ## ## -## @seealso{blkproc} +## @seealso{blockproc} ## @end deftypefn function [varargout] = bestblk (ims, k = 100) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ean...@us...> - 2012-09-23 21:17:08
|
Revision: 11091 http://octave.svn.sourceforge.net/octave/?rev=11091&view=rev Author: eandrius Date: 2012-09-23 21:17:01 +0000 (Sun, 23 Sep 2012) Log Message: ----------- instrument-control: changes to Makefiles regarding autoloading/unloading of functions Modified Paths: -------------- trunk/octave-forge/main/instrument-control/src/Makefile trunk/octave-forge/main/instrument-control/src/i2c/Makefile trunk/octave-forge/main/instrument-control/src/parallel/Makefile trunk/octave-forge/main/instrument-control/src/serial/Makefile Removed Paths: ------------- trunk/octave-forge/main/instrument-control/PKG_ADD Deleted: trunk/octave-forge/main/instrument-control/PKG_ADD =================================================================== --- trunk/octave-forge/main/instrument-control/PKG_ADD 2012-09-23 15:47:11 UTC (rev 11090) +++ trunk/octave-forge/main/instrument-control/PKG_ADD 2012-09-23 21:17:01 UTC (rev 11091) @@ -1,26 +0,0 @@ -# Serial -autoload ("serial", "instrument-control.oct"); -autoload ("srl_timeout", "instrument-control.oct"); -autoload ("srl_stopbits", "instrument-control.oct"); -autoload ("srl_read", "instrument-control.oct"); -autoload ("srl_parity", "instrument-control.oct"); -autoload ("srl_close", "instrument-control.oct"); -autoload ("srl_bytesize", "instrument-control.oct"); -autoload ("srl_write", "instrument-control.oct"); -autoload ("srl_flush", "instrument-control.oct"); -autoload ("srl_baudrate", "instrument-control.oct"); - -# I2C -autoload ("i2c", "instrument-control.oct"); -autoload ("i2c_addr", "instrument-control.oct"); -autoload ("i2c_read", "instrument-control.oct"); -autoload ("i2c_close", "instrument-control.oct"); -autoload ("i2c_write", "instrument-control.oct"); - -# Parallel -autoload ("parallel", "instrument-control.oct"); -autoload ("pp_close", "instrument-control.oct"); -autoload ("pp_ctrl", "instrument-control.oct"); -autoload ("pp_data", "instrument-control.oct"); -autoload ("pp_datadir", "instrument-control.oct"); -autoload ("pp_stat", "instrument-control.oct"); \ No newline at end of file Modified: trunk/octave-forge/main/instrument-control/src/Makefile =================================================================== --- trunk/octave-forge/main/instrument-control/src/Makefile 2012-09-23 15:47:11 UTC (rev 11090) +++ trunk/octave-forge/main/instrument-control/src/Makefile 2012-09-23 21:17:01 UTC (rev 11091) @@ -1,11 +1,11 @@ -OCT = instrument-control.oct +#OCT = instrument-control.oct SUBDIRS = i2c serial parallel MKOCTFILE ?= mkoctfile all: @for dir in $(SUBDIRS); do $(MAKE) -C $$dir; done - $(MKOCTFILE) i2c/*.o serial/*.o parallel/*.o -o $(OCT) + #$(MKOCTFILE) i2c/*.o serial/*.o parallel/*.o -o $(OCT) clean: @for dir in $(SUBDIRS); do $(MAKE) -C $$dir clean; done Modified: trunk/octave-forge/main/instrument-control/src/i2c/Makefile =================================================================== --- trunk/octave-forge/main/instrument-control/src/i2c/Makefile 2012-09-23 15:47:11 UTC (rev 11090) +++ trunk/octave-forge/main/instrument-control/src/i2c/Makefile 2012-09-23 21:17:01 UTC (rev 11091) @@ -1,19 +1,12 @@ -OCT := i2c.oct -OBJ := i2c.o i2c_close.o i2c_addr.o i2c_write.o i2c_read.o +OCT := i2c.oct i2c_close.oct i2c_addr.oct i2c_write.oct i2c_read.oct MKOCTFILE ?= mkoctfile -all: $(OBJ) +all: $(OCT) -oct: $(OCT) +%.oct: %.cc + $(MKOCTFILE) $^ -o ../$@ -%.oct: $(OBJ) - $(MKOCTFILE) $^ - -%.o: %.cc - $(MKOCTFILE) -c -s $< - - clean: rm -f *.oct *.o Modified: trunk/octave-forge/main/instrument-control/src/parallel/Makefile =================================================================== --- trunk/octave-forge/main/instrument-control/src/parallel/Makefile 2012-09-23 15:47:11 UTC (rev 11090) +++ trunk/octave-forge/main/instrument-control/src/parallel/Makefile 2012-09-23 21:17:01 UTC (rev 11091) @@ -1,19 +1,12 @@ -OCT := parallel.oct -OBJ := parallel.o pp_close.o pp_datadir.o pp_data.o pp_stat.o pp_ctrl.o +OCT := parallel.oct pp_close.oct pp_datadir.oct pp_data.oct pp_stat.oct pp_ctrl.oct MKOCTFILE ?= mkoctfile -all: $(OBJ) +all: $(OCT) -oct: $(OCT) +%.oct: %.cc + $(MKOCTFILE) $^ -o ../$@ -%.oct: $(OBJ) - $(MKOCTFILE) $^ - -%.o: %.cc - $(MKOCTFILE) -c -s $< - - clean: rm -f *.oct *.o Modified: trunk/octave-forge/main/instrument-control/src/serial/Makefile =================================================================== --- trunk/octave-forge/main/instrument-control/src/serial/Makefile 2012-09-23 15:47:11 UTC (rev 11090) +++ trunk/octave-forge/main/instrument-control/src/serial/Makefile 2012-09-23 21:17:01 UTC (rev 11091) @@ -1,19 +1,13 @@ -OCT := serial.oct -OBJ := serial.o srl_baudrate.o srl_timeout.o srl_bytesize.o srl_flush.o \ - srl_parity.o srl_stopbits.o srl_write.o srl_close.o srl_read.o +OCT := serial.oct srl_baudrate.oct srl_timeout.oct srl_bytesize.oct srl_flush.oct \ + srl_parity.oct srl_stopbits.oct srl_write.oct srl_close.oct srl_read.oct MKOCTFILE ?= mkoctfile -all: $(OBJ) +all: $(OCT) -oct: $(OCT) +%.oct: %.cc + $(MKOCTFILE) $^ -o ../$@ -%.oct: $(OBJ) - $(MKOCTFILE) $^ - -%.o: %.cc - $(MKOCTFILE) -c -s $< - clean: rm -f *.oct *.o This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ean...@us...> - 2012-09-23 15:47:22
|
Revision: 11090 http://octave.svn.sourceforge.net/octave/?rev=11090&view=rev Author: eandrius Date: 2012-09-23 15:47:11 +0000 (Sun, 23 Sep 2012) Log Message: ----------- instrument-control: i2c, fix for constructor argument parsing Modified Paths: -------------- trunk/octave-forge/main/instrument-control/src/i2c/i2c.cc Modified: trunk/octave-forge/main/instrument-control/src/i2c/i2c.cc =================================================================== --- trunk/octave-forge/main/instrument-control/src/i2c/i2c.cc 2012-09-23 15:40:53 UTC (rev 11089) +++ trunk/octave-forge/main/instrument-control/src/i2c/i2c.cc 2012-09-23 15:47:11 UTC (rev 11090) @@ -67,7 +67,7 @@ } DEFUN_DLD (i2c, args, nargout, -"-*- texinfo -*-\n\ + "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {@var{i2c} = } i2c ([@var{path}], [@var{address}])\n \ \n\ Open i2c interface.\n \ @@ -84,10 +84,6 @@ #endif int nargin = args.length(); - - // Default values - int oflags = O_RDWR; - string path("/dev/i2c-0"); // Do not open interface if return value is not assigned if (nargout != 1) @@ -96,6 +92,47 @@ return octave_value(); } + // Default values + int oflags = O_RDWR; + string path("/dev/i2c-0"); + int addr = -1; + + if (!type_loaded) + { + octave_i2c::register_type(); + type_loaded = true; + } + + // Parse the function arguments + if (args.length() > 0) + { + if (args(0).is_string()) + { + path = args(0).string_value(); + } + else + { + print_usage(); + return octave_value(); + } + + } + + // is_float_type() is or'ed to allow expression like ("", 123), without user + // having to use ("", int32(123)), as we still only take "int_value" + if (args.length() > 1) + { + if (args(1).is_integer_type() || args(1).is_float_type()) + { + addr = args(1).int_value(); + } + else + { + print_usage(); + return octave_value(); + } + } + // Open the interface octave_i2c* retval = new octave_i2c(path, oflags); @@ -105,5 +142,8 @@ return octave_value(); } + if (addr > 0) + retval->set_addr(addr); + return octave_value(retval); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ean...@us...> - 2012-09-23 15:41:05
|
Revision: 11089 http://octave.svn.sourceforge.net/octave/?rev=11089&view=rev Author: eandrius Date: 2012-09-23 15:40:53 +0000 (Sun, 23 Sep 2012) Log Message: ----------- instrument-control: i2c, texinfo help strings Modified Paths: -------------- trunk/octave-forge/main/instrument-control/src/i2c/i2c.cc trunk/octave-forge/main/instrument-control/src/i2c/i2c_addr.cc trunk/octave-forge/main/instrument-control/src/i2c/i2c_close.cc trunk/octave-forge/main/instrument-control/src/i2c/i2c_read.cc trunk/octave-forge/main/instrument-control/src/i2c/i2c_write.cc Modified: trunk/octave-forge/main/instrument-control/src/i2c/i2c.cc =================================================================== --- trunk/octave-forge/main/instrument-control/src/i2c/i2c.cc 2012-09-23 08:54:28 UTC (rev 11088) +++ trunk/octave-forge/main/instrument-control/src/i2c/i2c.cc 2012-09-23 15:40:53 UTC (rev 11089) @@ -66,7 +66,17 @@ os << this->fd; } -DEFUN_DLD (i2c, args, nargout, "") +DEFUN_DLD (i2c, args, nargout, +"-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{i2c} = } i2c ([@var{path}], [@var{address}])\n \ +\n\ +Open i2c interface.\n \ +\n\ +@var{path} - the interface path of type String. If omitted defaults to '/dev/i2c-0'. @*\ +@var{address} - the slave device address. If omitted must be set using i2c_addr() call.\n \ +\n\ +The i2c() shall return instance of @var{octave_i2c} class as the result @var{i2c}.\n \ +@end deftypefn") { #ifdef __WIN32__ error("i2c: Windows platform support is not yet implemented, go away..."); Modified: trunk/octave-forge/main/instrument-control/src/i2c/i2c_addr.cc =================================================================== --- trunk/octave-forge/main/instrument-control/src/i2c/i2c_addr.cc 2012-09-23 08:54:28 UTC (rev 11088) +++ trunk/octave-forge/main/instrument-control/src/i2c/i2c_addr.cc 2012-09-23 15:40:53 UTC (rev 11089) @@ -26,7 +26,20 @@ #include "i2c.h" -DEFUN_DLD (i2c_addr, args, nargout, "") +DEFUN_DLD (i2c_addr, args, nargout, +"-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {} i2c_addr (@var{i2c}, @var{address})\n \ +@deftypefnx {Loadable Function} {@var{addr} = } i2c_addr (@var{i2c})\n \ +\n\ +Set new or get existing i2c slave device address.\n \ +\n\ +@var{i2c} - instance of @var{octave_i2c} class.@*\ +@var{address} - i2c slave device address of type Integer. \ +The address is passed in the 7 or 10 lower bits of the argument.\n \ +\n\ +If @var{address} parameter is omitted, the i2c_addr() shall return \ +current i2c slave device address as the result @var{addr}.\n \ +@end deftypefn") { if (args.length() > 2 || args(0).type_id() != octave_i2c::static_type_id()) Modified: trunk/octave-forge/main/instrument-control/src/i2c/i2c_close.cc =================================================================== --- trunk/octave-forge/main/instrument-control/src/i2c/i2c_close.cc 2012-09-23 08:54:28 UTC (rev 11088) +++ trunk/octave-forge/main/instrument-control/src/i2c/i2c_close.cc 2012-09-23 15:40:53 UTC (rev 11089) @@ -25,7 +25,14 @@ #include "i2c.h" -DEFUN_DLD (i2c_close, args, nargout, "") +DEFUN_DLD (i2c_close, args, nargout, +"-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {} i2c_close (@var{i2c})\n \ +\n\ +Close the interface and release a file descriptor.\n \ +\n\ +@var{i2c} - instance of @var{octave_i2c} class.@*\ +@end deftypefn") { if (args.length() != 1 || args(0).type_id() != octave_i2c::static_type_id()) { Modified: trunk/octave-forge/main/instrument-control/src/i2c/i2c_read.cc =================================================================== --- trunk/octave-forge/main/instrument-control/src/i2c/i2c_read.cc 2012-09-23 08:54:28 UTC (rev 11088) +++ trunk/octave-forge/main/instrument-control/src/i2c/i2c_read.cc 2012-09-23 15:40:53 UTC (rev 11089) @@ -26,7 +26,17 @@ #include "i2c.h" -DEFUN_DLD (i2c_read, args, nargout, "") +DEFUN_DLD (i2c_read, args, nargout, +"-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {[@var{data}, @var{count}] = } i2c_read (@var{i2c}, @var{n})\n \ +\n\ +Read from i2c slave device.\n \ +\n\ +@var{i2c} - instance of @var{octave_i2c} class.@*\ +@var{n} - number of bytes to attempt to read of type Integer.\n \ +\n\ +The i2c_read() shall return number of bytes successfully read in @var{count} as Integer and the bytes themselves in @var{data} as uint8 array.\n \ +@end deftypefn") { if (args.length() < 1 || args.length() > 2 || args(0).type_id() != octave_i2c::static_type_id()) { Modified: trunk/octave-forge/main/instrument-control/src/i2c/i2c_write.cc =================================================================== --- trunk/octave-forge/main/instrument-control/src/i2c/i2c_write.cc 2012-09-23 08:54:28 UTC (rev 11088) +++ trunk/octave-forge/main/instrument-control/src/i2c/i2c_write.cc 2012-09-23 15:40:53 UTC (rev 11089) @@ -28,7 +28,17 @@ using std::string; -DEFUN_DLD (i2c_write, args, nargout, "") +DEFUN_DLD (i2c_write, args, nargout, +"-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{n} = } i2c_write (@var{i2c}, @var{data})\n \ +\n\ +Write data to a i2c slave device.\n \ +\n\ +@var{i2c} - instance of @var{octave_i2c} class.@*\ +@var{data} - data to be written to the slave device. Can be either of String or uint8 type.\n \ +\n\ +Upon successful completion, i2c_write() shall return the number of bytes written as the result @var{n}.\n \ +@end deftypefn") { if (args.length() != 2 || args(0).type_id() != octave_i2c::static_type_id()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-23 08:54:35
|
Revision: 11088 http://octave.svn.sourceforge.net/octave/?rev=11088&view=rev Author: paramaniac Date: 2012-09-23 08:54:28 +0000 (Sun, 23 Sep 2012) Log Message: ----------- control: work on multi plot slim draft code Modified Paths: -------------- trunk/octave-forge/main/control/devel/lsim2.m Modified: trunk/octave-forge/main/control/devel/lsim2.m =================================================================== --- trunk/octave-forge/main/control/devel/lsim2.m 2012-09-23 08:38:14 UTC (rev 11087) +++ trunk/octave-forge/main/control/devel/lsim2.m 2012-09-23 08:54:28 UTC (rev 11088) @@ -1,4 +1,4 @@ -## Copyright (C) 2009, 2010, 2011 Lukas F. Reichlin +## Copyright (C) 2009, 2010, 2011, 2012 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -60,7 +60,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.3 +## Version: 0.4 % function [y_r, t_r, x_r] = lsim (sys, u, t = [], x0 = [], method = "zoh") function [y_r, t_r, x_r] = lsim (varargin) @@ -69,19 +69,24 @@ print_usage (); endif - sys_idx = cellfun (@isa, varargin, {"lti"}); # look for LTI models - sys_cell = cellfun (@ss, varargin(sys_idx), "uniformoutput", false); # convert to state-space + sys_idx = find (cellfun (@isa, args, {"lti"})); # look for LTI models, 'find' needed for plot styles + sys_cell = cellfun (@ss, args(sys_idx), "uniformoutput", false); # convert to state-space if (! size_equal (sys_cell{:})) error ("lsim: models must have equal sizes"); endif - vec_idx = find (cellfun (@is_real_matrix, varargin)); - n_vec = length (vec_idx); - n_sys = length (sys_cell); + mat_idx = find (cellfun (@is_real_matrix, args)); # indices of matrix arguments + n_mat = length (mat_idx); # number of vector arguments + n_sys = length (sys_cell); # number of LTI systems + ## function [y, x_arr] = __linear_simulation__ (sys_dt, u, t, x0) + + [y, x] = cellfun (@__linear_simulation__, sys_dt_cell, {u}, t, {x0}, "uniformoutput", false); + +%{ if (! isa (sys, "ss")) sys = ss (sys); # sys must be proper endif @@ -148,9 +153,82 @@ error ("lsim: input vector u must have %d columns", m); endif +%} + + if (nargout == 0) # plot information + [p, m] = size (sys_cell{1}); + style_idx = find (cellfun (@ischar, varargin)); + str = "Linear Simulation Results"; + outname = get (sys_cell{end}, "outname"); + outname = __labels__ (outname, "y"); + colororder = get (gca, "colororder"); + rc = rows (colororder); + + for k = 1 : n_sys # for every system + if (k == n_sys) + lim = numel (args); + else + lim = sys_idx(k+1); + endif + style = args(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); + if (isempty (style)) + color = colororder(1+rem (k-1, rc), :); + style = {"color", color}; + endif + if (ct_idx(k)) # continuous-time system + for i = 1 : p # for every output + subplot (p, 1, i); + plot (t{k}, y{k}(:, i), style{:}); + hold on; + grid on; + if (k == n_sys) + axis tight + ylim (__axis_margin__ (ylim)) + ylabel (outname{i}); + if (i == 1) + title (str); + endif + endif + endfor + endfor + else # discrete-time system + for i = 1 : p # for every output + subplot (p, 1, i); + stairs (t{k}, y{k}(:, i), style{:}); + hold on; + grid on; + if (k == n_sys) + axis tight; + ylim (__axis_margin__ (ylim)) + ylabel (outname{i}); + if (i == 1) + title (str); + endif + endif + endfor + endfor + endif + endfor + xlabel ("Time [s]"); + if (p == 1 && m == 1) + legend (sysname) + endif + hold off; + endif + +endfunction + + +function [y, x_arr] = __linear_simulation__ (sys_dt, u, t, x0) + + [A, B, C, D] = ssdata (sys_dt); + [p, m] = size (D); # number of outputs and inputs + n = rows (A); # number of states + len_t = length (t); + ## preallocate memory - y = zeros (trows, p); - x_arr = zeros (trows, n); + y = zeros (len_t, p); + x_arr = zeros (len_t, n); ## initial conditions if (isempty (x0)) @@ -162,46 +240,13 @@ x = reshape (x0, [], 1); # make sure that x is a column vector ## simulation - for k = 1 : trows + for k = 1 : len_t y(k, :) = C * x + D * u(k, :).'; x_arr(k, :) = x; x = A * x + B * u(k, :).'; endfor - if (nargout == 0) # plot information - str = ["Linear Simulation Results of ", inputname(1)]; - outname = get (sys, "outname"); - outname = __labels__ (outname, "y_"); - if (discrete) # discrete system - for k = 1 : p - subplot (p, 1, k); - stairs (t, y(:, k)); - grid ("on"); - if (k == 1) - title (str); - endif - ylabel (sprintf ("Amplitude %s", outname{k})); - endfor - xlabel ("Time [s]"); - else # continuous system - for k = 1 : p - subplot (p, 1, k); - plot (t, y(:, k)); - grid ("on"); - if (k == 1) - title (str); - endif - ylabel (sprintf ("Amplitude %s", outname{k})); - endfor - xlabel ("Time [s]"); - endif - else # return values - y_r = y; - t_r = t; - x_r = x_arr; - endif - endfunction -## TODO: add test cases \ No newline at end of file +## TODO: add test cases This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-23 08:38:20
|
Revision: 11087 http://octave.svn.sourceforge.net/octave/?rev=11087&view=rev Author: paramaniac Date: 2012-09-23 08:38:14 +0000 (Sun, 23 Sep 2012) Log Message: ----------- control: style fix in time response code Modified Paths: -------------- trunk/octave-forge/main/control/devel/multiplot2.m trunk/octave-forge/main/control/inst/__time_response__.m Modified: trunk/octave-forge/main/control/devel/multiplot2.m =================================================================== --- trunk/octave-forge/main/control/devel/multiplot2.m 2012-09-22 22:03:02 UTC (rev 11086) +++ trunk/octave-forge/main/control/devel/multiplot2.m 2012-09-23 08:38:14 UTC (rev 11087) @@ -94,7 +94,7 @@ % Step Response of Closed Loop figure (2) -step2 (T, Tr4, Tr2) +step (T, Tr4, Tr2) %{ % Step Response of Closed Loop Modified: trunk/octave-forge/main/control/inst/__time_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__time_response__.m 2012-09-22 22:03:02 UTC (rev 11086) +++ trunk/octave-forge/main/control/inst/__time_response__.m 2012-09-23 08:38:14 UTC (rev 11087) @@ -166,16 +166,15 @@ color = colororder(1+rem (k-1, rc), :); style = {"color", color}; endif - discrete = ! ct_idx(k); - if (discrete) # discrete-time system + if (ct_idx(k)) # continuous-time system for i = 1 : p # for every output for j = 1 : cols # for every input (except for initial where cols=1) subplot (p, cols, (i-1)*cols+j); - stairs (t{k}, y{k}(:, i, j), style{:}); + plot (t{k}, y{k}(:, i, j), style{:}); hold on; grid on; if (k == n_sys) - axis tight; + axis tight ylim (__axis_margin__ (ylim)) if (j == 1) ylabel (outname{i}); @@ -186,20 +185,15 @@ endif endfor endfor - else # continuous-time system + else # discrete-time system for i = 1 : p # for every output for j = 1 : cols # for every input (except for initial where cols=1) subplot (p, cols, (i-1)*cols+j); - ##if (n_sys == 1 && isstable (sys_cell{1})) - ## plot (t{k}, y{k}(:, i, j), style{:}, [t{k}(1), t{k}(end)], repmat (yfinal(i,j), 1, 2)); - ## ## TODO: plot final value first such that its line doesn't overprint the response - ##else - plot (t{k}, y{k}(:, i, j), style{:}); - ##endif + stairs (t{k}, y{k}(:, i, j), style{:}); hold on; grid on; if (k == n_sys) - axis tight + axis tight; ylim (__axis_margin__ (ylim)) if (j == 1) ylabel (outname{i}); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpi...@us...> - 2012-09-22 22:03:08
|
Revision: 11086 http://octave.svn.sourceforge.net/octave/?rev=11086&view=rev Author: jpicarbajal Date: 2012-09-22 22:03:02 +0000 (Sat, 22 Sep 2012) Log Message: ----------- signal: fixing permission of file Property Changed: ---------------- trunk/octave-forge/main/signal/inst/clustersegment.m Property changes on: trunk/octave-forge/main/signal/inst/clustersegment.m ___________________________________________________________________ Deleted: svn:executable - * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ean...@us...> - 2012-09-22 19:55:15
|
Revision: 11085 http://octave.svn.sourceforge.net/octave/?rev=11085&view=rev Author: eandrius Date: 2012-09-22 19:55:09 +0000 (Sat, 22 Sep 2012) Log Message: ----------- instrument-control: INDEX update Modified Paths: -------------- trunk/octave-forge/main/instrument-control/INDEX Modified: trunk/octave-forge/main/instrument-control/INDEX =================================================================== --- trunk/octave-forge/main/instrument-control/INDEX 2012-09-22 19:39:06 UTC (rev 11084) +++ trunk/octave-forge/main/instrument-control/INDEX 2012-09-22 19:55:09 UTC (rev 11085) @@ -1,12 +1,25 @@ instrument-control >> Low level I/O functions - Serial serial srl_read srl_write + srl_baudrate + srl_bytesize + srl_flush + srl_parity + srl_stopbits + srl_timeout srl_close - I2C i2c + i2c_addr i2c_read i2c_write + i2c_close +Parallel + parallel + pp_datadir + pp_data + pp_ctrl + pp_stat + pp_close This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ean...@us...> - 2012-09-22 19:39:16
|
Revision: 11084 http://octave.svn.sourceforge.net/octave/?rev=11084&view=rev Author: eandrius Date: 2012-09-22 19:39:06 +0000 (Sat, 22 Sep 2012) Log Message: ----------- instrument-control: change of license (LGPL -> GPL) Modified Paths: -------------- trunk/octave-forge/main/instrument-control/COPYING trunk/octave-forge/main/instrument-control/DESCRIPTION Modified: trunk/octave-forge/main/instrument-control/COPYING =================================================================== --- trunk/octave-forge/main/instrument-control/COPYING 2012-09-22 11:11:14 UTC (rev 11083) +++ trunk/octave-forge/main/instrument-control/COPYING 2012-09-22 19:39:06 UTC (rev 11084) @@ -1,165 +1,621 @@ - GNU LESSER GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + Preamble - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. + The GNU General Public License is a free, copyleft license for +software and other kinds of works. - 0. Additional Definitions. + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. - 1. Exception to Section 3 of the GNU GPL. + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. + The precise terms and conditions for copying, distribution and +modification follow. - 2. Conveying Modified Versions. + TERMS AND CONDITIONS - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: + 0. Definitions. - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or + "This License" refers to version 3 of the GNU General Public License. - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. - 3. Object Code Incorporating Material from Library Header Files. + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. + A "covered work" means either the unmodified Program or a work based +on the Program. - b) Accompany the object code with a copy of the GNU GPL and this license - document. + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. - 4. Combined Works. + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. + 1. Source Code. - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. - d) Do one of the following: + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) + The Corresponding Source for a work in source code form is that +same work. - 5. Combined Libraries. + 2. Basic Permissions. - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. - 6. Revised Versions of the GNU Lesser General Public License. + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS Modified: trunk/octave-forge/main/instrument-control/DESCRIPTION =================================================================== --- trunk/octave-forge/main/instrument-control/DESCRIPTION 2012-09-22 11:11:14 UTC (rev 11083) +++ trunk/octave-forge/main/instrument-control/DESCRIPTION 2012-09-22 19:39:06 UTC (rev 11084) @@ -8,4 +8,4 @@ Categories: instrument-control Depends: octave (>= 3.2.0) Autoload: no -License: LGPLv3+ +License: GPLv3+ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 11:11:20
|
Revision: 11083 http://octave.svn.sourceforge.net/octave/?rev=11083&view=rev Author: paramaniac Date: 2012-09-22 11:11:14 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: fix copy-paste glitch Modified Paths: -------------- trunk/octave-forge/main/control/inst/Anderson.m Modified: trunk/octave-forge/main/control/inst/Anderson.m =================================================================== --- trunk/octave-forge/main/control/inst/Anderson.m 2012-09-22 11:04:32 UTC (rev 11082) +++ trunk/octave-forge/main/control/inst/Anderson.m 2012-09-22 11:11:14 UTC (rev 11083) @@ -68,4 +68,4 @@ T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); figure (3) -step (T{:}, 200) +step (T{:}, 300) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 11:04:38
|
Revision: 11082 http://octave.svn.sourceforge.net/octave/?rev=11082&view=rev Author: paramaniac Date: 2012-09-22 11:04:32 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: update news Modified Paths: -------------- trunk/octave-forge/main/control/NEWS Modified: trunk/octave-forge/main/control/NEWS =================================================================== --- trunk/octave-forge/main/control/NEWS 2012-09-22 10:58:32 UTC (rev 11081) +++ trunk/octave-forge/main/control/NEWS 2012-09-22 11:04:32 UTC (rev 11082) @@ -1,6 +1,22 @@ Summary of important user-visible changes for releases of the control package =============================================================================== +control-2.4.0 Release Date: 2012-09-xx Release Manager: Lukas Reichlin +=============================================================================== + +** Multiplot feature for time-domain plotting: + + impulse lsim + initial step + +** Anderson, Madievski, MDSSystem, optiPID + Updated example scripts to use new multiplot feature. + +** doc/control.pdf + Updated PDF manual. + + +=============================================================================== control-2.3.54 Release Date: 2012-09-15 Release Manager: Lukas Reichlin =============================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 10:58:38
|
Revision: 11081 http://octave.svn.sourceforge.net/octave/?rev=11081&view=rev Author: paramaniac Date: 2012-09-22 10:58:32 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: use multiplot step command (4) Modified Paths: -------------- trunk/octave-forge/main/control/inst/Anderson.m Modified: trunk/octave-forge/main/control/inst/Anderson.m =================================================================== --- trunk/octave-forge/main/control/inst/Anderson.m 2012-09-22 10:45:18 UTC (rev 11080) +++ trunk/octave-forge/main/control/inst/Anderson.m 2012-09-22 10:58:32 UTC (rev 11081) @@ -50,31 +50,22 @@ L = lqe (G, W, V) % Coprime Factorization using Balanced Truncation Approximation +Kr = arrayfun (@(k) cfconred (G, F, L, k), 8:-1:2, 'uniformoutput', false); % 'method', 'bfsr-bta' +T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); + figure (1) -for k = 8:-1:2 - Kr = cfconred (G, F, L, k); % 'method', 'bfsr-bta' - T = feedback (G*Kr); - step (T, 200) - hold on -endfor -hold off +step (T{:}, 200) % Coprime Factorization using Singular Perturbation Approximation +Kr = arrayfun (@(k) cfconred (G, F, L, k, 'method', 'bfsr-spa'), 8:-1:2, 'uniformoutput', false); +T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); + figure (2) -for k = 8:-1:2 - Kr = cfconred (G, F, L, k, 'method', 'bfsr-spa'); - T = feedback (G*Kr); - step (T, 200) - hold on -endfor -hold off +step (T{:}, 200) % Frequency-Weighted Coprime Factorization using BTA +Kr = arrayfun (@(k) fwcfconred (G, F, L, k), 8:-1:2, 'uniformoutput', false); +T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); + figure (3) -for k = 8:-1:2 - Kr = fwcfconred (G, F, L, k); - T = feedback (G*Kr); - step (T, 300) - hold on -endfor -hold off +step (T{:}, 200) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 10:45:23
|
Revision: 11080 http://octave.svn.sourceforge.net/octave/?rev=11080&view=rev Author: paramaniac Date: 2012-09-22 10:45:18 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: use multiplot step command (3) Modified Paths: -------------- trunk/octave-forge/main/control/inst/Madievski.m Modified: trunk/octave-forge/main/control/inst/Madievski.m =================================================================== --- trunk/octave-forge/main/control/inst/Madievski.m 2012-09-22 10:42:26 UTC (rev 11079) +++ trunk/octave-forge/main/control/inst/Madievski.m 2012-09-22 10:45:18 UTC (rev 11080) @@ -86,18 +86,11 @@ w = {1e-2, 1e1}; % Bode Plot of Controller +figure (1) bode (K, Kr4, Kr2, w) -legend ('K (8 states)', 'Kr (4 states)', 'Kr (2 states)', 'location', 'southwest') +legend ('K (8 states)', 'Kr (4 states)', 'Kr (2 states)', 'Location', 'SouthWest') % Step Response of Closed Loop -[y, t] = step (T, 100); -[yr4, tr4] = step (Tr4, 100); -[yr2, tr2] = step (Tr2, 100); - figure (2) -plot (t, y, tr4, yr4, tr2, yr2) -grid ('on') -title ('Step Response of Closed Loop') -xlabel ('Time [s]') -ylabel ('Output [-]') +step (T, Tr4, Tr2, 100) legend ('K (8 states)', 'Kr (4 states)', 'Kr (2 states)', 'Location', 'SouthEast') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 10:42:32
|
Revision: 11079 http://octave.svn.sourceforge.net/octave/?rev=11079&view=rev Author: paramaniac Date: 2012-09-22 10:42:26 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: use multiplot step command (2) Modified Paths: -------------- trunk/octave-forge/main/control/inst/MDSSystem.m Modified: trunk/octave-forge/main/control/inst/MDSSystem.m =================================================================== --- trunk/octave-forge/main/control/inst/MDSSystem.m 2012-09-22 10:39:31 UTC (rev 11078) +++ trunk/octave-forge/main/control/inst/MDSSystem.m 2012-09-22 10:42:26 UTC (rev 11079) @@ -145,16 +145,17 @@ L_ncf = G * K_ncf; % open loop T_ncf = feedback (L_ncf); % closed loop + % =============================================================================== +% Plot Results +% =============================================================================== -% Plotting +% Bode Plot figure (2) -bode (K_mix, K_ncf) % bode plot +bode (K_mix, K_ncf) +% Step Response figure (3) -step (T_mix, 10) % step response for 10 seconds +step (T_mix, T_ncf, 10) % step response for 10 seconds -figure (4) -step (T_ncf, 10) % step response for 10 seconds - % =============================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 10:39:37
|
Revision: 11078 http://octave.svn.sourceforge.net/octave/?rev=11078&view=rev Author: paramaniac Date: 2012-09-22 10:39:31 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: use multiplot step command Modified Paths: -------------- trunk/octave-forge/main/control/inst/optiPID.m Modified: trunk/octave-forge/main/control/inst/optiPID.m =================================================================== --- trunk/octave-forge/main/control/inst/optiPID.m 2012-09-22 10:30:58 UTC (rev 11077) +++ trunk/octave-forge/main/control/inst/optiPID.m 2012-09-22 10:39:31 UTC (rev 11078) @@ -88,15 +88,8 @@ [gamma_opt, phi_opt] = margin (L_opt) % Plot Step Response -[y_AH, t_AH] = step (T_AH, t); -[y_opt, t_opt] = step (T_opt, t); - figure (1) -plot (t_AH, y_AH, 'b', t_opt, y_opt, 'r') -grid ('on') -title ('Step Response') -xlabel ('Time [s]') -ylabel ('Output [-]') -legend ('A/H', 'Optimized', 'Location', 'SouthEast') +step (T_AH, 'b', T_opt, 'r', t) +legend ('Astroem/Haegglund PID', 'Optimized PID', 'Location', 'SouthEast') % =============================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 10:31:04
|
Revision: 11077 http://octave.svn.sourceforge.net/octave/?rev=11077&view=rev Author: paramaniac Date: 2012-09-22 10:30:58 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: finish multiplot initial and impulse functions Modified Paths: -------------- trunk/octave-forge/main/control/inst/impulse.m trunk/octave-forge/main/control/inst/initial.m Modified: trunk/octave-forge/main/control/inst/impulse.m =================================================================== --- trunk/octave-forge/main/control/inst/impulse.m 2012-09-22 10:26:10 UTC (rev 11076) +++ trunk/octave-forge/main/control/inst/impulse.m 2012-09-22 10:30:58 UTC (rev 11077) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009, 2012 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -54,22 +54,35 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 -function [y_r, t_r, x_r] = impulse (sys, tfinal = [], dt = []) +function [y_r, t_r, x_r] = impulse (varargin) - ## TODO: multiplot feature: impulse (sys1, "b", sys2, "r", ...) - - if (nargin == 0 || nargin > 3) + if (nargin == 0) print_usage (); endif + + if (nargout) + sysname = {}; + else + sys_idx = find (cellfun (@isa, varargin, {"lti"})); + len = length (sys_idx); + sysname = cell (len, 1); + for k = 1 : len + try + sysname{k} = inputname(sys_idx(k)); + catch + sysname{k} = ""; + end_try_catch + endfor + endif - [y, t, x] = __time_response__ (sys, "impulse", ! nargout, tfinal, dt, [], inputname (1)); + [y, t, x] = __time_response__ ("impulse", varargin, sysname, ! nargout); if (nargout) - y_r = y; - t_r = t; - x_r = x; + y_r = y{1}; + t_r = t{1}; + x_r = x{1}; endif endfunction Modified: trunk/octave-forge/main/control/inst/initial.m =================================================================== --- trunk/octave-forge/main/control/inst/initial.m 2012-09-22 10:26:10 UTC (rev 11076) +++ trunk/octave-forge/main/control/inst/initial.m 2012-09-22 10:30:58 UTC (rev 11077) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009, 2012 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -66,22 +66,35 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 -function [y_r, t_r, x_r] = initial (sys, x0, tfinal = [], dt = []) +function [y_r, t_r, x_r] = initial (varargin) - ## TODO: multiplot feature: initial (sys1, "b", sys2, "r", ..., x0, ...) - - if (nargin < 2 || nargin > 4) + if (nargin < 2) print_usage (); endif - [y, t, x] = __time_response__ (sys, "initial", ! nargout, tfinal, dt, x0, inputname (1)); + if (nargout) + sysname = {}; + else + sys_idx = find (cellfun (@isa, varargin, {"lti"})); + len = length (sys_idx); + sysname = cell (len, 1); + for k = 1 : len + try + sysname{k} = inputname(sys_idx(k)); + catch + sysname{k} = ""; + end_try_catch + endfor + endif + [y, t, x] = __time_response__ ("initial", varargin, sysname, ! nargout); + if (nargout) - y_r = y; - t_r = t; - x_r = x; + y_r = y{1}; + t_r = t{1}; + x_r = x{1}; endif endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 10:26:16
|
Revision: 11076 http://octave.svn.sourceforge.net/octave/?rev=11076&view=rev Author: paramaniac Date: 2012-09-22 10:26:10 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: fix function names Modified Paths: -------------- trunk/octave-forge/main/control/inst/step.m Modified: trunk/octave-forge/main/control/inst/step.m =================================================================== --- trunk/octave-forge/main/control/inst/step.m 2012-09-22 10:25:04 UTC (rev 11075) +++ trunk/octave-forge/main/control/inst/step.m 2012-09-22 10:26:10 UTC (rev 11076) @@ -56,7 +56,7 @@ ## Created: October 2009 ## Version: 0.2 -function [y_r, t_r, x_r] = step2 (varargin) +function [y_r, t_r, x_r] = step (varargin) if (nargin == 0) print_usage (); @@ -77,7 +77,7 @@ endfor endif - [y, t, x] = __time_response_2__ ("step", varargin, sysname, ! nargout); + [y, t, x] = __time_response__ ("step", varargin, sysname, ! nargout); if (nargout) y_r = y{1}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 10:25:14
|
Revision: 11075 http://octave.svn.sourceforge.net/octave/?rev=11075&view=rev Author: paramaniac Date: 2012-09-22 10:25:04 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: remove cruft Modified Paths: -------------- trunk/octave-forge/main/control/devel/multiplot3.m Removed Paths: ------------- trunk/octave-forge/main/control/devel/__time_response_2__.m trunk/octave-forge/main/control/devel/step2.m Deleted: trunk/octave-forge/main/control/devel/__time_response_2__.m =================================================================== --- trunk/octave-forge/main/control/devel/__time_response_2__.m 2012-09-22 10:23:23 UTC (rev 11074) +++ trunk/octave-forge/main/control/devel/__time_response_2__.m 2012-09-22 10:25:04 UTC (rev 11075) @@ -1,414 +0,0 @@ -## Copyright (C) 2009, 2010, 2012 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## LTI Syncope is free software: you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## LTI Syncope is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with LTI Syncope. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Common code for the time response functions step, impulse and initial. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.3 - -% function [y, t, x_arr] = __time_response_2__ (sys, response, plotflag, tfinal, dt, x0, sysname) -function [y, t, x] = __time_response_2__ (response, args, sysname, plotflag) - - sys_idx = find (cellfun (@isa, args, {"lti"})); # look for LTI models, 'find' needed for plot styles - sys_cell = cellfun (@ss, args(sys_idx), "uniformoutput", false); # convert to state-space - - if (! size_equal (sys_cell{:})) - error ("%s: models must have equal sizes", response); - endif - - vec_idx = find (cellfun (@is_real_matrix, args)); # indices of vector arguments - n_vec = length (vec_idx); # number of vector arguments - n_sys = length (sys_cell); # number of LTI systems - - tfinal = []; - dt = []; - x0 = []; - - ## extract tfinal/t, dt, x0 from args - if (strcmpi (response, "initial")) - if (n_vec < 1) - error ("initial: require initial state vector 'x0'"); - else # initial state vector x0 specified - arg = args{vec_idx(1)}; - if (is_real_vector (arg)) - x0 = arg; - else - error ("initial: initial state vector 'x0' must be a vector of real values"); - endif - if (n_vec > 1) # tfinal or time vector t specified - arg = args{vec_idx(2)}; - if (issample (arg)) - tfinal = arg; - elseif (isempty (arg)) - ## tfinal = []; # nothing to do here - elseif (is_real_vector (arg)) - dt = abs (arg(2) - arg(1)); # assume that t is regularly spaced - tfinal = arg(end); - else - warning ("initial: argument number %d ignored", vec_idx(2)); - endif - if (n_vec > 2) # sampling time dt specified - arg = args{vec_idx(3)}; - if (issample (arg)) - dt = arg; - else - warning ("initial: argument number %d ignored", vec_idx(3)); - endif - if (n_vec > 3) - warning ("initial: ignored"); - endif - endif - endif - endif - else # step or impulse response - if (n_vec > 0) # tfinal or time vector t specified - arg = args{vec_idx(1)}; - if (issample (arg)) - tfinal = arg; - elseif (isempty (arg)) - ## tfinal = []; # nothing to do here - elseif (is_real_vector (arg)) - dt = abs (arg(2) - arg(1)); # assume that t is regularly spaced - tfinal = arg(end); - else - warning ("%s: argument number %d ignored", response, vec_idx(1)); - endif - if (n_vec > 1) # sampling time dt specified - arg = args{vec_idx(2)}; - if (issample (arg)) - dt = arg; - else - warning ("%s: argument number %d ignored", response, vec_idx(2)); - endif - if (n_vec > 2) - warning ("%s: ignored", response); - endif - endif - endif - endif - ## TODO: share common code between initial and step/impulse - - [tfinal, dt] = cellfun (@__sim_horizon__, sys_cell, {tfinal}, {dt}, "uniformoutput", false); - tfinal = max ([tfinal{:}]); - - ct_idx = cellfun (@isct, sys_cell); - sys_dt_cell = sys_cell; - tmp = cellfun (@c2d, sys_cell(ct_idx), dt(ct_idx), {"zoh"}, "uniformoutput", false); - sys_dt_cell(ct_idx) = tmp; - - ## time vector - t = @cellfun (@(dt) reshape (0 : dt : tfinal, [], 1), dt, "uniformoutput", false); - - ## function [y, x_arr] = __initial_response__ (sys, sys_dt, t, x0) - ## function [y, x_arr] = __step_response__ (sys_dt, t) - ## function [y, x_arr] = __impulse_response__ (sys, sys_dt, t) - - switch (response) - case "initial" - [y, x] = cellfun (@__initial_response__, sys_dt_cell, t, {x0}, "uniformoutput", false); - case "step" - [y, x] = cellfun (@__step_response__, sys_dt_cell, t, "uniformoutput", false); - case "impulse" - [y, x] = cellfun (@__impulse_response__, sys_cell, sys_dt_cell, t, "uniformoutput", false); - otherwise - error ("time_response: invalid response type"); - endswitch - - - if (plotflag) # display plot - [p, m] = size (sys_cell{1}); - switch (response) - case "initial" - str = "Response to Initial Conditions"; - cols = 1; - ## yfinal = zeros (p, 1); - case "step" - str = "Step Response"; - cols = m; - ## yfinal = dcgain (sys_cell{1}); - case "impulse" - str = "Impulse Response"; - cols = m; - ## yfinal = zeros (p, m); - otherwise - error ("time_response: invalid response type"); - endswitch - - style_idx = find (cellfun (@ischar, args)); - outname = get (sys_cell{end}, "outname"); - outname = __labels__ (outname, "y"); - colororder = get (gca, "colororder"); - rc = rows (colororder); - - for k = 1 : n_sys # for every system - if (k == n_sys) - lim = numel (args); - else - lim = sys_idx(k+1); - endif - style = args(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); - if (isempty (style)) - color = colororder(1+rem (k-1, rc), :); - style = {"color", color}; - endif - discrete = ! ct_idx(k); - if (discrete) # discrete-time system - for i = 1 : p # for every output - for j = 1 : cols # for every input (except for initial where cols=1) - subplot (p, cols, (i-1)*cols+j); - stairs (t{k}, y{k}(:, i, j), style{:}); - hold on; - grid on; - if (k == n_sys) - axis tight; - ylim (__axis_margin__ (ylim)) - if (j == 1) - ylabel (outname{i}); - if (i == 1) - title (str); - endif - endif - endif - endfor - endfor - else # continuous-time system - for i = 1 : p # for every output - for j = 1 : cols # for every input (except for initial where cols=1) - subplot (p, cols, (i-1)*cols+j); - ##if (n_sys == 1 && isstable (sys_cell{1})) - ## plot (t{k}, y{k}(:, i, j), style{:}, [t{k}(1), t{k}(end)], repmat (yfinal(i,j), 1, 2)); - ## ## TODO: plot final value first such that its line doesn't overprint the response - ##else - plot (t{k}, y{k}(:, i, j), style{:}); - ##endif - hold on; - grid on; - if (k == n_sys) - axis tight - ylim (__axis_margin__ (ylim)) - if (j == 1) - ylabel (outname{i}); - if (i == 1) - title (str); - endif - endif - endif - endfor - endfor - endif - endfor - xlabel ("Time [s]"); - if (p == 1 && m == 1) - legend (sysname) - endif - hold off; - endif - -endfunction - - -function [y, x_arr] = __initial_response__ (sys_dt, t, x0) - - [F, G, C, D] = ssdata (sys_dt); # system must be proper - - n = rows (F); # number of states - m = columns (G); # number of inputs - p = rows (C); # number of outputs - l_t = length (t); - - ## preallocate memory - y = zeros (l_t, p); - x_arr = zeros (l_t, n); - - ## initial conditions - x = reshape (x0, [], 1); # make sure that x is a column vector - - if (n != length (x0) || ! is_real_vector (x0)) - error ("initial: x0 must be a real vector with %d elements", n); - endif - - ## simulation - for k = 1 : l_t - y(k, :) = C * x; - x_arr(k, :) = x; - x = F * x; - endfor - -endfunction - - -function [y, x_arr] = __step_response__ (sys_dt, t) - - [F, G, C, D] = ssdata (sys_dt); # system must be proper - - n = rows (F); # number of states - m = columns (G); # number of inputs - p = rows (C); # number of outputs - l_t = length (t); - - ## preallocate memory - y = zeros (l_t, p, m); - x_arr = zeros (l_t, n, m); - - for j = 1 : m # for every input channel - ## initial conditions - x = zeros (n, 1); - u = zeros (m, 1); - u(j) = 1; - - ## simulation - for k = 1 : l_t - y(k, :, j) = C * x + D * u; - x_arr(k, :, j) = x; - x = F * x + G * u; - endfor - endfor - -endfunction - - -function [y, x_arr] = __impulse_response__ (sys, sys_dt, t) - - [~, B] = ssdata (sys); - [F, G, C, D, dt] = ssdata (sys_dt); # system must be proper - dt = abs (dt); # use 1 second if tsam is unspecified (-1) - discrete = ! isct (sys); - - n = rows (F); # number of states - m = columns (G); # number of inputs - p = rows (C); # number of outputs - l_t = length (t); - - ## preallocate memory - y = zeros (l_t, p, m); - x_arr = zeros (l_t, n, m); - - for j = 1 : m # for every input channel - ## initial conditions - u = zeros (m, 1); - u(j) = 1; - - if (discrete) - x = zeros (n, 1); # zero by definition - y(1, :, j) = D * u / dt; - x_arr(1, :, j) = x; - x = G * u / dt; - else - x = B * u; # B, not G! - y(1, :, j) = C * x; - x_arr(1, :, j) = x; - x = F * x; - endif - - ## simulation - for k = 2 : l_t - y (k, :, j) = C * x; - x_arr(k, :, j) = x; - x = F * x; - endfor - endfor - - if (discrete) - y *= dt; - x_arr *= dt; - endif - -endfunction - - -function [tfinal, dt] = __sim_horizon__ (sys, tfinal, Ts) - - ## code based on __stepimp__.m of Kai P. Mueller and A. Scottedward Hodel - - TOL = 1.0e-10; # values below TOL are assumed to be zero - N_MIN = 50; # min number of points - N_MAX = 2000; # max number of points - N_DEF = 1000; # default number of points - T_DEF = 10; # default simulation time - - ev = pole (sys); - n = length (ev); # number of states/poles - continuous = isct (sys); - discrete = ! continuous; - - if (discrete) - dt = Ts = abs (get (sys, "tsam")); - ## perform bilinear transformation on poles in z - for k = 1 : n - pol = ev(k); - if (abs (pol + 1) < TOL) - ev(k) = 0; - else - ev(k) = 2 / Ts * (pol - 1) / (pol + 1); - endif - endfor - endif - - ## remove poles near zero from eigenvalue array ev - nk = n; - for k = 1 : n - if (abs (real (ev(k))) < TOL) - ev(k) = 0; - nk -= 1; - endif - endfor - - if (nk == 0) - if (isempty (tfinal)) - tfinal = T_DEF; - endif - - if (continuous) - dt = tfinal / N_DEF; - endif - else - ev = ev(find (ev)); - ev_max = max (abs (ev)); - - if (continuous) - dt = 0.2 * pi / ev_max; - endif - - if (isempty (tfinal)) - ev_min = min (abs (real (ev))); - tfinal = 5.0 / ev_min; - - ## round up - yy = 10^(ceil (log10 (tfinal)) - 1); - tfinal = yy * ceil (tfinal / yy); - endif - - if (continuous) - N = tfinal / dt; - - if (N < N_MIN) - dt = tfinal / N_MIN; - endif - - if (N > N_MAX) - dt = tfinal / N_MAX; - endif - endif - endif - - if (continuous && ! isempty (Ts)) # catch case cont. system with dt specified - dt = Ts; - endif - -endfunction Modified: trunk/octave-forge/main/control/devel/multiplot3.m =================================================================== --- trunk/octave-forge/main/control/devel/multiplot3.m 2012-09-22 10:23:23 UTC (rev 11074) +++ trunk/octave-forge/main/control/devel/multiplot3.m 2012-09-22 10:25:04 UTC (rev 11075) @@ -1,10 +1,10 @@ load tfs.dat figure (1) -step2 (T_AH, T_opt) +step (T_AH, T_opt) figure (2) -step2 (T_AH, '-.r', T_opt, '-b') +step (T_AH, '-.r', T_opt, '-b') figure (3) -step2 (T_AH, c2d (T_opt, 1)) +step (T_AH, c2d (T_opt, 1)) Deleted: trunk/octave-forge/main/control/devel/step2.m =================================================================== --- trunk/octave-forge/main/control/devel/step2.m 2012-09-22 10:23:23 UTC (rev 11074) +++ trunk/octave-forge/main/control/devel/step2.m 2012-09-22 10:25:04 UTC (rev 11075) @@ -1,89 +0,0 @@ -## Copyright (C) 2009, 2012 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## LTI Syncope is free software: you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## LTI Syncope is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with LTI Syncope. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}) -## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{t}) -## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}) -## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}, @var{dt}) -## Step response of LTI system. -## If no output arguments are given, the response is printed on the screen. -## -## @strong{Inputs} -## @table @var -## @item sys -## LTI model. -## @item t -## Time vector. Should be evenly spaced. If not specified, it is calculated by -## the poles of the system to reflect adequately the response transients. -## @item tfinal -## Optional simulation horizon. If not specified, it is calculated by -## the poles of the system to reflect adequately the response transients. -## @item dt -## Optional sampling time. Be sure to choose it small enough to capture transient -## phenomena. If not specified, it is calculated by the poles of the system. -## @end table -## -## @strong{Outputs} -## @table @var -## @item y -## Output response array. Has as many rows as time samples (length of t) -## and as many columns as outputs. -## @item t -## Time row vector. -## @item x -## State trajectories array. Has @code{length (t)} rows and as many columns as states. -## @end table -## -## @seealso{impulse, initial, lsim} -## @end deftypefn - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.2 - -% function [y_r, t_r, x_r] = step2 (sys, tfinal = [], dt = []) -function [y_r, t_r, x_r] = step2 (varargin) - - if (nargin == 0) - print_usage (); - endif - - if (nargout) - sysname = {}; - else - sys_idx = find (cellfun (@isa, varargin, {"lti"})); - len = length (sys_idx); - sysname = cell (len, 1); - for k = 1 : len - try - sysname{k} = inputname(sys_idx(k)); - catch - sysname{k} = ""; - end_try_catch - endfor - endif - - [y, t, x] = __time_response_2__ ("step", varargin, sysname, ! nargout); - - if (nargout) - y_r = y{1}; - t_r = t{1}; - x_r = x{1}; - endif - -endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-09-22 10:23:30
|
Revision: 11074 http://octave.svn.sourceforge.net/octave/?rev=11074&view=rev Author: paramaniac Date: 2012-09-22 10:23:23 +0000 (Sat, 22 Sep 2012) Log Message: ----------- control: move multiplot time response into place Modified Paths: -------------- trunk/octave-forge/main/control/inst/__time_response__.m trunk/octave-forge/main/control/inst/step.m Modified: trunk/octave-forge/main/control/inst/__time_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__time_response__.m 2012-09-22 10:14:12 UTC (rev 11073) +++ trunk/octave-forge/main/control/inst/__time_response__.m 2012-09-22 10:23:23 UTC (rev 11074) @@ -1,4 +1,4 @@ -## Copyright (C) 2009, 2010 Lukas F. Reichlin +## Copyright (C) 2009, 2010, 2012 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,241 +20,350 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.2 +## Version: 0.3 -function [y, t, x_arr] = __time_response__ (sys, resptype, plotflag, tfinal, dt, x0, sysname) +function [y, t, x] = __time_response__ (response, args, sysname, plotflag) - if (! isa (sys, "ss")) - sys = ss (sys); # sys must be proper - endif + sys_idx = find (cellfun (@isa, args, {"lti"})); # look for LTI models, 'find' needed for plot styles + sys_cell = cellfun (@ss, args(sys_idx), "uniformoutput", false); # convert to state-space - if (is_real_vector (tfinal) && length (tfinal) > 1) # time vector t passed - dt = tfinal(2) - tfinal(1); # assume that t is regularly spaced - tfinal = tfinal(end); + if (! size_equal (sys_cell{:})) + error ("%s: models must have equal sizes", response); endif - [A, B, C, D, tsam] = ssdata (sys); + vec_idx = find (cellfun (@is_real_matrix, args)); # indices of vector arguments + n_vec = length (vec_idx); # number of vector arguments + n_sys = length (sys_cell); # number of LTI systems - discrete = ! isct (sys); # static gains are treated as analog systems - tsam = abs (tsam); # use 1 second if tsam is unspecified (-1) + tfinal = []; + dt = []; + x0 = []; - if (discrete) - if (! isempty (dt)) - warning ("time_response: argument dt has no effect on sampling time of discrete system"); + ## extract tfinal/t, dt, x0 from args + if (strcmpi (response, "initial")) + if (n_vec < 1) + error ("initial: require initial state vector 'x0'"); + else # initial state vector x0 specified + arg = args{vec_idx(1)}; + if (is_real_vector (arg)) + x0 = arg; + else + error ("initial: initial state vector 'x0' must be a vector of real values"); + endif + if (n_vec > 1) # tfinal or time vector t specified + arg = args{vec_idx(2)}; + if (issample (arg)) + tfinal = arg; + elseif (isempty (arg)) + ## tfinal = []; # nothing to do here + elseif (is_real_vector (arg)) + dt = abs (arg(2) - arg(1)); # assume that t is regularly spaced + tfinal = arg(end); + else + warning ("initial: argument number %d ignored", vec_idx(2)); + endif + if (n_vec > 2) # sampling time dt specified + arg = args{vec_idx(3)}; + if (issample (arg)) + dt = arg; + else + warning ("initial: argument number %d ignored", vec_idx(3)); + endif + if (n_vec > 3) + warning ("initial: ignored"); + endif + endif + endif + endif + else # step or impulse response + if (n_vec > 0) # tfinal or time vector t specified + arg = args{vec_idx(1)}; + if (issample (arg)) + tfinal = arg; + elseif (isempty (arg)) + ## tfinal = []; # nothing to do here + elseif (is_real_vector (arg)) + dt = abs (arg(2) - arg(1)); # assume that t is regularly spaced + tfinal = arg(end); + else + warning ("%s: argument number %d ignored", response, vec_idx(1)); + endif + if (n_vec > 1) # sampling time dt specified + arg = args{vec_idx(2)}; + if (issample (arg)) + dt = arg; + else + warning ("%s: argument number %d ignored", response, vec_idx(2)); + endif + if (n_vec > 2) + warning ("%s: ignored", response); + endif + endif endif - - dt = tsam; endif + ## TODO: share common code between initial and step/impulse - [tfinal, dt] = __sim_horizon__ (A, discrete, tfinal, dt); + [tfinal, dt] = cellfun (@__sim_horizon__, sys_cell, {tfinal}, {dt}, "uniformoutput", false); + tfinal = max ([tfinal{:}]); - if (! discrete) - sys = c2d (sys, dt, "zoh"); - endif + ct_idx = cellfun (@isct, sys_cell); + sys_dt_cell = sys_cell; + tmp = cellfun (@c2d, sys_cell(ct_idx), dt(ct_idx), {"zoh"}, "uniformoutput", false); + sys_dt_cell(ct_idx) = tmp; - [F, G] = ssdata (sys); # matrices C and D don't change + ## time vector + t = @cellfun (@(dt) reshape (0 : dt : tfinal, [], 1), dt, "uniformoutput", false); - n = rows (F); # number of states - m = columns (G); # number of inputs - p = rows (C); # number of outputs + ## function [y, x_arr] = __initial_response__ (sys, sys_dt, t, x0) + ## function [y, x_arr] = __step_response__ (sys_dt, t) + ## function [y, x_arr] = __impulse_response__ (sys, sys_dt, t) - ## time vector - t = reshape (0 : dt : tfinal, [], 1); - l_t = length (t); - - switch (resptype) + switch (response) case "initial" - str = ["Response of ", sysname, " to Initial Conditions"]; - yfinal = zeros (p, 1); + [y, x] = cellfun (@__initial_response__, sys_dt_cell, t, {x0}, "uniformoutput", false); + case "step" + [y, x] = cellfun (@__step_response__, sys_dt_cell, t, "uniformoutput", false); + case "impulse" + [y, x] = cellfun (@__impulse_response__, sys_cell, sys_dt_cell, t, "uniformoutput", false); + otherwise + error ("time_response: invalid response type"); + endswitch - ## preallocate memory - y = zeros (l_t, p); - x_arr = zeros (l_t, n); - ## initial conditions - x = reshape (x0, [], 1); # make sure that x is a column vector - - if (n != length (x0) || ! is_real_vector (x0)) - error ("initial: x0 must be a real vector with %d elements", n); + if (plotflag) # display plot + [p, m] = size (sys_cell{1}); + switch (response) + case "initial" + str = "Response to Initial Conditions"; + cols = 1; + ## yfinal = zeros (p, 1); + case "step" + str = "Step Response"; + cols = m; + ## yfinal = dcgain (sys_cell{1}); + case "impulse" + str = "Impulse Response"; + cols = m; + ## yfinal = zeros (p, m); + otherwise + error ("time_response: invalid response type"); + endswitch + + style_idx = find (cellfun (@ischar, args)); + outname = get (sys_cell{end}, "outname"); + outname = __labels__ (outname, "y"); + colororder = get (gca, "colororder"); + rc = rows (colororder); + + for k = 1 : n_sys # for every system + if (k == n_sys) + lim = numel (args); + else + lim = sys_idx(k+1); endif + style = args(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); + if (isempty (style)) + color = colororder(1+rem (k-1, rc), :); + style = {"color", color}; + endif + discrete = ! ct_idx(k); + if (discrete) # discrete-time system + for i = 1 : p # for every output + for j = 1 : cols # for every input (except for initial where cols=1) + subplot (p, cols, (i-1)*cols+j); + stairs (t{k}, y{k}(:, i, j), style{:}); + hold on; + grid on; + if (k == n_sys) + axis tight; + ylim (__axis_margin__ (ylim)) + if (j == 1) + ylabel (outname{i}); + if (i == 1) + title (str); + endif + endif + endif + endfor + endfor + else # continuous-time system + for i = 1 : p # for every output + for j = 1 : cols # for every input (except for initial where cols=1) + subplot (p, cols, (i-1)*cols+j); + ##if (n_sys == 1 && isstable (sys_cell{1})) + ## plot (t{k}, y{k}(:, i, j), style{:}, [t{k}(1), t{k}(end)], repmat (yfinal(i,j), 1, 2)); + ## ## TODO: plot final value first such that its line doesn't overprint the response + ##else + plot (t{k}, y{k}(:, i, j), style{:}); + ##endif + hold on; + grid on; + if (k == n_sys) + axis tight + ylim (__axis_margin__ (ylim)) + if (j == 1) + ylabel (outname{i}); + if (i == 1) + title (str); + endif + endif + endif + endfor + endfor + endif + endfor + xlabel ("Time [s]"); + if (p == 1 && m == 1) + legend (sysname) + endif + hold off; + endif - ## simulation - for k = 1 : l_t - y(k, :) = C * x; - x_arr(k, :) = x; - x = F * x; - endfor +endfunction - case "step" - str = ["Step Response of ", sysname]; - yfinal = dcgain (sys); - ## preallocate memory - y = zeros (l_t, p, m); - x_arr = zeros (l_t, n, m); +function [y, x_arr] = __initial_response__ (sys_dt, t, x0) - for j = 1 : m # for every input channel - ## initial conditions - x = zeros (n, 1); - u = zeros (m, 1); - u(j) = 1; + [F, G, C, D] = ssdata (sys_dt); # system must be proper - ## simulation - for k = 1 : l_t - y(k, :, j) = C * x + D * u; - x_arr(k, :, j) = x; - x = F * x + G * u; - endfor - endfor + n = rows (F); # number of states + m = columns (G); # number of inputs + p = rows (C); # number of outputs + l_t = length (t); - case "impulse" - str = ["Impulse Response of ", sysname]; - yfinal = zeros (p, m); + ## preallocate memory + y = zeros (l_t, p); + x_arr = zeros (l_t, n); - ## preallocate memory - y = zeros (l_t, p, m); - x_arr = zeros (l_t, n, m); + ## initial conditions + x = reshape (x0, [], 1); # make sure that x is a column vector - for j = 1 : m # for every input channel - ## initial conditions - u = zeros (m, 1); - u(j) = 1; + if (n != length (x0) || ! is_real_vector (x0)) + error ("initial: x0 must be a real vector with %d elements", n); + endif - if (discrete) - x = zeros (n, 1); # zero by definition - y(1, :, j) = D * u / dt; - x_arr(1, :, j) = x; - x = G * u / dt; - else - x = B * u; # B, not G! - y(1, :, j) = C * x; - x_arr(1, :, j) = x; - x = F * x; - endif + ## simulation + for k = 1 : l_t + y(k, :) = C * x; + x_arr(k, :) = x; + x = F * x; + endfor - ## simulation - for k = 2 : l_t - y (k, :, j) = C * x; - x_arr(k, :, j) = x; - x = F * x; - endfor - endfor - - if (discrete) - y *= dt; - x_arr *= dt; - endif - - otherwise - error ("time_response: invalid response type"); - - endswitch - +endfunction - if (plotflag) # display plot - ## TODO: Set correct titles, especially for multi-input systems +function [y, x_arr] = __step_response__ (sys_dt, t) - stable = isstable (sys); - outname = get (sys, "outname"); - outname = __labels__ (outname, "y_"); + [F, G, C, D] = ssdata (sys_dt); # system must be proper - if (strcmp (resptype, "initial")) - cols = 1; - else - cols = m; - endif + n = rows (F); # number of states + m = columns (G); # number of inputs + p = rows (C); # number of outputs + l_t = length (t); - if (discrete) # discrete system - for k = 1 : p - for j = 1 : cols + ## preallocate memory + y = zeros (l_t, p, m); + x_arr = zeros (l_t, n, m); - subplot (p, cols, (k-1)*cols+j); + for j = 1 : m # for every input channel + ## initial conditions + x = zeros (n, 1); + u = zeros (m, 1); + u(j) = 1; - if (stable) - stairs (t, [y(:, k, j), yfinal(k, j) * ones(l_t, 1)]); - else - stairs (t, y(:, k, j)); - endif + ## simulation + for k = 1 : l_t + y(k, :, j) = C * x + D * u; + x_arr(k, :, j) = x; + x = F * x + G * u; + endfor + endfor - grid ("on"); +endfunction - if (k == 1 && j == 1) - title (str); - endif - if (j == 1) - ylabel (sprintf ("Amplitude %s", outname{k})); - endif +function [y, x_arr] = __impulse_response__ (sys, sys_dt, t) - endfor - endfor + [~, B] = ssdata (sys); + [F, G, C, D, dt] = ssdata (sys_dt); # system must be proper + dt = abs (dt); # use 1 second if tsam is unspecified (-1) + discrete = ! isct (sys); - xlabel ("Time [s]"); + n = rows (F); # number of states + m = columns (G); # number of inputs + p = rows (C); # number of outputs + l_t = length (t); - else # continuous system - for k = 1 : p - for j = 1 : cols + ## preallocate memory + y = zeros (l_t, p, m); + x_arr = zeros (l_t, n, m); - subplot (p, cols, (k-1)*cols+j); + for j = 1 : m # for every input channel + ## initial conditions + u = zeros (m, 1); + u(j) = 1; - if (stable) - plot (t, [y(:, k, j), yfinal(k, j) * ones(l_t, 1)]); - else - plot (t, y(:, k, j)); - endif + if (discrete) + x = zeros (n, 1); # zero by definition + y(1, :, j) = D * u / dt; + x_arr(1, :, j) = x; + x = G * u / dt; + else + x = B * u; # B, not G! + y(1, :, j) = C * x; + x_arr(1, :, j) = x; + x = F * x; + endif - grid ("on"); + ## simulation + for k = 2 : l_t + y (k, :, j) = C * x; + x_arr(k, :, j) = x; + x = F * x; + endfor + endfor - if (k == 1 && j == 1) - title (str); - endif - - if (j == 1) - ylabel (sprintf ("Amplitude %s", outname{k})); - endif - - endfor - endfor - - xlabel ("Time [s]"); - - endif + if (discrete) + y *= dt; + x_arr *= dt; endif endfunction -function [tfinal, dt] = __sim_horizon__ (A, discrete, tfinal, Ts) +function [tfinal, dt] = __sim_horizon__ (sys, tfinal, Ts) ## code based on __stepimp__.m of Kai P. Mueller and A. Scottedward Hodel - TOL = 1.0e-10; # values below TOL are assumed to be zero - N_MIN = 50; # min number of points - N_MAX = 2000; # max number of points - N_DEF = 1000; # default number of points - T_DEF = 10; # default simulation time + TOL = 1.0e-10; # values below TOL are assumed to be zero + N_MIN = 50; # min number of points + N_MAX = 2000; # max number of points + N_DEF = 1000; # default number of points + T_DEF = 10; # default simulation time - n = rows (A); - eigw = eig (A); + ev = pole (sys); + n = length (ev); # number of states/poles + continuous = isct (sys); + discrete = ! continuous; if (discrete) + dt = Ts = abs (get (sys, "tsam")); ## perform bilinear transformation on poles in z for k = 1 : n - pol = eigw(k); + pol = ev(k); if (abs (pol + 1) < TOL) - eigw(k) = 0; + ev(k) = 0; else - eigw(k) = 2 / Ts * (pol - 1) / (pol + 1); + ev(k) = 2 / Ts * (pol - 1) / (pol + 1); endif endfor endif - ## remove poles near zero from eigenvalue array eigw + ## remove poles near zero from eigenvalue array ev nk = n; for k = 1 : n - if (abs (real (eigw(k))) < TOL) - eigw(k) = 0; + if (abs (real (ev(k))) < TOL) + ev(k) = 0; nk -= 1; endif endfor @@ -264,27 +373,27 @@ tfinal = T_DEF; endif - if (! discrete) + if (continuous) dt = tfinal / N_DEF; endif else - eigw = eigw(find (eigw)); - eigw_max = max (abs (eigw)); + ev = ev(find (ev)); + ev_max = max (abs (ev)); - if (! discrete) - dt = 0.2 * pi / eigw_max; + if (continuous) + dt = 0.2 * pi / ev_max; endif if (isempty (tfinal)) - eigw_min = min (abs (real (eigw))); - tfinal = 5.0 / eigw_min; + ev_min = min (abs (real (ev))); + tfinal = 5.0 / ev_min; ## round up yy = 10^(ceil (log10 (tfinal)) - 1); tfinal = yy * ceil (tfinal / yy); endif - if (! discrete) + if (continuous) N = tfinal / dt; if (N < N_MIN) @@ -297,7 +406,7 @@ endif endif - if (! isempty (Ts)) # catch case cont. system with dt specified + if (continuous && ! isempty (Ts)) # catch case cont. system with dt specified dt = Ts; endif Modified: trunk/octave-forge/main/control/inst/step.m =================================================================== --- trunk/octave-forge/main/control/inst/step.m 2012-09-22 10:14:12 UTC (rev 11073) +++ trunk/octave-forge/main/control/inst/step.m 2012-09-22 10:23:23 UTC (rev 11074) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009, 2012 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -54,22 +54,35 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 -function [y_r, t_r, x_r] = step (sys, tfinal = [], dt = []) +function [y_r, t_r, x_r] = step2 (varargin) - ## TODO: multiplot feature: step (sys1, "b", sys2, "r", ...) - - if (nargin == 0 || nargin > 3) + if (nargin == 0) print_usage (); endif - [y, t, x] = __time_response__ (sys, "step", ! nargout, tfinal, dt, [], inputname (1)); + if (nargout) + sysname = {}; + else + sys_idx = find (cellfun (@isa, varargin, {"lti"})); + len = length (sys_idx); + sysname = cell (len, 1); + for k = 1 : len + try + sysname{k} = inputname(sys_idx(k)); + catch + sysname{k} = ""; + end_try_catch + endfor + endif + [y, t, x] = __time_response_2__ ("step", varargin, sysname, ! nargout); + if (nargout) - y_r = y; - t_r = t; - x_r = x; + y_r = y{1}; + t_r = t{1}; + x_r = x{1}; endif endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |