add a third parameter to pca to disable graphical outputs
Allan Cornet [Thu, 10 Jan 2008 14:47:43 +0000 (14:47 +0000)]
add test (cannot create .ref :( )
user request

scilab/modules/statistics/help/en_US/pca.xml
scilab/modules/statistics/macros/pca.sci
scilab/modules/statistics/tests/benchmarks/bench_pca.tst [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/pca.tst [new file with mode: 0644]

index a62c553..e515ba9 100644 (file)
@@ -8,7 +8,7 @@
   <SHORT_DESCRIPTION name="pca">  Principal components analysis</SHORT_DESCRIPTION>
 
   <CALLING_SEQUENCE>
-  <CALLING_SEQUENCE_ITEM>[lambda,facpr,comprinc] = pca(x,N)</CALLING_SEQUENCE_ITEM>
+  <CALLING_SEQUENCE_ITEM>[lambda,facpr,comprinc] = pca(x,N,disable_graphics)</CALLING_SEQUENCE_ITEM>
   </CALLING_SEQUENCE>
 
   <PARAM>
 
     </PARAM_DESCRIPTION>
     </PARAM_ITEM>
+    
+    <PARAM_ITEM>
+    <PARAM_NAME>disable_graphics</PARAM_NAME>
+    <PARAM_DESCRIPTION>
+      <SP> : a boolean. %t to disable output graphics outputs. this parameter is optional.</SP>
+    </PARAM_DESCRIPTION>
+    </PARAM_ITEM>
 
     <PARAM_ITEM>
     <PARAM_NAME>lambda</PARAM_NAME>
@@ -96,6 +103,13 @@ maximal.
 </P>
   </DESCRIPTION>
 
+ <EXAMPLE>
+    <![CDATA[
+  a=rand(100,10,'n');
+  [lambda,facpr,comprinc] = pca(a);
+ ]]>
+  </EXAMPLE>
+
   <AUTHOR>
     Carlos Klimann
   </AUTHOR>
index fc948ae..ae95ac8 100644 (file)
@@ -1,4 +1,4 @@
-function [lambda,facpr,comprinc]=pca(x,N)
+function [lambda,facpr,comprinc]=pca(varargin)
 //
 //This  function performs  several  computations known  as
 //"principal component  analysis". It includes  drawing of
@@ -46,25 +46,45 @@ function [lambda,facpr,comprinc]=pca(x,N)
 //author: carlos klimann
 //
 //date: 2002-02-05
-//commentary fixed 2003-19-24
-//
+//commentary fixed 2003-19-24 ??
+// update disable graphics output Allan CORNET 2008
+// request user
   [lhs,rhs]=argn(0)
-  if  rhs==0 then
-    error('pca must have at least one parameter'), 
+  x = [];
+  N = [];
+  no_graphics = %f;
+  
+  select rhs,
+       case 1 then
+         x = varargin(1);
+         N=[1 2];
+       case 2 then 
+         x = varargin(1);
+         N = varargin(2);
+       case 3 then
+         x = varargin(1);
+         N = varargin(2);
+         no_graphics = varargin(3);
+       else
+       error(sprintf("%s: Wrong number of input argument(s).\n","pca"));
+       end
+
+  if ( type(no_graphics) <> 4 ) then
+    error(sprintf("%s: Wrong type for third input argument: Boolean expected.\n" ,"pca"));
   end
+
   if x==[] then
-    lambda=%nan
-    facpr=%nan
-    comprinc=%nan, 
-    return, 
+    lambda=%nan;
+    facpr=%nan;
+    comprinc=%nan; 
+    return; 
   end
+
   [rowx colx]=size(x)
-  if rhs==2 then
-    if size(N,'*')<>2 then error('Second parameter has bad dimensions'), end,
-    if max(N)>colx then disp('Graph demand out of bounds'), return, end
-  else 
-    N=[1 2],
-  end
+  if size(N,'*')<>2 then error('Second parameter has bad dimensions'), end,
+  if max(N)>colx then disp('Graph demand out of bounds'), return, end
+  
   xbar=sum(x,'r')/rowx
   y=x-ones(rowx,1)*xbar
   std=(sum(y .^2,'r')) .^ .5 
@@ -75,37 +95,45 @@ function [lambda,facpr,comprinc]=pca(x,N)
   facpr=facpr(:,order)
   comprinc=x*facpr
   
-  
-  w=winsid();if w==[] then w=0, else w=max(w)+1,end
-  fig1=scf(w)
-
-  rc= (ones(colx,1)* sqrt((lambda(N,1))')) .* facpr(:,order(N)) 
-  
-  rango=rank(V)
-  ra=[1:rango]'
-  if rango<=1 then return, end
-  plot2d(-rc(ra,1),rc(ra,2),style=-10)
-  legend('(r(c1,xj),r(c2,xj)')
-  ax=gca();ax.x_location="middle";ax.y_location = "middle";
-  blue=color('blue')
-  for k=1:rango,
-    xstring(rc(k,1),rc(k,2),'X'+string(k)),
-    e=gce();e.foreground=blue;
-  end
-  title(' -Correlations Circle- ')
-  fig2=scf(w+1);
-  plot2d3([0;ra;rango+1]',[0; lambda(ra,2);0])
-  plot2d(ra,lambda(ra,2),style=9)
-  ax=gca(); ax.grid=[31 31]
-  plot2d3([0;ra;rango+1]',[0; lambda(ra,2);0])
-  plot2d(ra,lambda(ra,2),style=9)
-  for k=1:rango,
-    xstring(k,0,'l'+string(k)),
-    e=gce();e.font_style=1
-  end
-  title(' -Eigenvalues (in percent)- ')
-  ylabel('%')
-
+  if ~no_graphics then
+    w = winsid();
+    if (w == []) then 
+      w = 0; 
+    else
+      w = max(w)+1;
+    end
+    fig1 = scf(w);
+    
+    rc = (ones(colx,1)* sqrt((lambda(N,1))')) .* facpr(:,order(N)) ;
+    rango = rank(V);
+    ra = [1:rango]';
+    if ( rango <= 1 ) then return, end
+    plot2d(-rc(ra,1),rc(ra,2),style=-10);
+    legend('(r(c1,xj),r(c2,xj)');
+    ax=gca();
+    ax.x_location="middle";
+    ax.y_location = "middle";
+    blue=color('blue')
+    for k=1:rango,
+      xstring(rc(k,1),rc(k,2),'X'+string(k));
+      e=gce();
+      e.foreground=blue;
+    end
+    title(' -Correlations Circle- ');
+    fig2 = scf(w+1);
+    plot2d3([0;ra;rango+1]',[0; lambda(ra,2);0]);
+    plot2d(ra,lambda(ra,2),style=9);
+    ax=gca();
+    ax.grid=[31 31];
+    plot2d3([0;ra;rango+1]',[0; lambda(ra,2);0])
+    plot2d(ra,lambda(ra,2),style=9)
+    for k=1:rango,
+      xstring(k,0,'l'+string(k)),
+      e=gce();e.font_style=1
+    end
+    title(' -Eigenvalues (in percent)- ')
+    ylabel('%')
+  end  
 endfunction
 
 
diff --git a/scilab/modules/statistics/tests/benchmarks/bench_pca.tst b/scilab/modules/statistics/tests/benchmarks/bench_pca.tst
new file mode 100644 (file)
index 0000000..5924bdd
--- /dev/null
@@ -0,0 +1,12 @@
+//==============================================================================\r
+// Benchmark for sva function\r
+// Copyright INRIA 2007\r
+//==============================================================================\r
+\r
+// <-- BENCH NB RUN : 100 -->\r
+stacksize(80000000);\r
+A = rand(1000,100,'n');\r
+\r
+// <-- BENCH START -->\r
+B=pca(A,[1 2],%t);\r
+// <-- BENCH END -->\r
diff --git a/scilab/modules/statistics/tests/unit_tests/pca.tst b/scilab/modules/statistics/tests/unit_tests/pca.tst
new file mode 100644 (file)
index 0000000..a19ba3c
--- /dev/null
@@ -0,0 +1,20 @@
+// <-- TEST WITH GRAPHIC -->\r
+// =============================================================================\r
+// Tests for pca function\r
+// Scilab Team\r
+// Copyright INRIA\r
+// =============================================================================\r
+if execstr('pca()','errcatch')==0 then pause,end\r
+// =============================================================================\r
+a=rand(100,10,'n');\r
+[r1,r2,r3] = pca(a);\r
+// =============================================================================\r
+[ra,rb,rc] = pca(a, [1 2]);\r
+if ( or(r1 <> ra) | or(r2 <> rb) | or(r3 <> rc)) then pause,end\r
+// =============================================================================\r
+[ra,rb,rc] = pca(a, [1 2],%t);\r
+if ( or(r1 <> ra) | or(r2 <> rb) | or(r3 <> rc)) then pause,end\r
+// =============================================================================\r
+[ra,rb,rc] = pca(a, [1 2],%f);\r
+if ( or(r1 <> ra) | or(r2 <> rb) | or(r3 <> rc) ) then pause,end\r
+// =============================================================================\r