Commit 1032ae3f authored by Andreas J. Guelzow 's avatar Andreas J. Guelzow

Add principal components analysis

2009-12-22  Andreas J. Guelzow <aguelzow@pyrshep.ca>

	* POTFILES.in: added src/dialogs/dialog-analysis-tool-principal-components.c
	  and src/tools/analysis-principal-components.c
	* POTFILES.skip: added src/dialogs/principal-components.glade

2009-12-22  Andreas J. Guelzow <aguelzow@pyrshep.ca>

	* POTFILES.in: added src/dialogs/dialog-analysis--principal-components.c,
	  src/tools/analysis-principal-components.c and
	  src/dialogs/principal-components.glade

2009-12-22  Andreas J. Guelzow <aguelzow@pyrshep.ca>

	* component/Gnumeric-embed.xml.in: add principal components analysis
	* src/HILDON_Gnumeric-gtk.xml.in: add principal components analysis
	* src/GNOME_Gnumeric-gtk.xml.in: add principal components analysis
	* src/wbc-gtk-actions.c: add principal components analysis action
	* src/mathfunc.c (gnm_matrix_eigen): handle 1 by 1 matrix.

2009-12-22 Andreas J. Guelzow <aguelzow@pyrshep.ca>

	* dialog-analysis-tool-principal-components.c: new
	* principal-components.glade: new
	* Makefile.am: add the above
	* dialogs.h (dialog_principal_components_tool): new
	* help.h (GNUMERIC_HELP_LINK_PRINCIPAL_COMPONENTS): new

2009-12-22 Andreas J. Guelzow <aguelzow@pyrshep.ca>

	* analysis-principal-components.c: new
	* analysis-principal-components.h: new
	* Makefile.am: add the above
	* analysis-tools.c (analysis_tool_table): make non-static and add
	  full_table argument. Change all callers.
	* analysis-tools.h (analysis_tool_table): new
parent 8f5f51a3
2009-12-22 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* component/Gnumeric-embed.xml.in: add principal components analysis
* src/HILDON_Gnumeric-gtk.xml.in: add principal components analysis
* src/GNOME_Gnumeric-gtk.xml.in: add principal components analysis
* src/wbc-gtk-actions.c: add principal components analysis action
* src/mathfunc.c (gnm_matrix_eigen): handle 1 by 1 matrix.
2009-12-21 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* src/mathfunc.h (gnm_matrix_eigen): new
......
......@@ -4,6 +4,7 @@ Andreas:
* Add paste special flip horizontally and vertically [#393367]
* Add EIGEN function to calculate eigenvalues and eigenvectors
of real symmetric matrices
* Add principal components analysis
Jean
* Fix import export of line type in scatter plots. [#605043]
......
......@@ -184,6 +184,7 @@
</menu>
<menuitem action="ToolsKaplanMeier"/>
<menuitem action="ToolsNormalityTests"/>
<menuitem action="ToolsPrincipalComponents"/>
<menuitem action="ToolsRanking"/>
<menuitem action="ToolsRegression"/>
<menuitem action="ToolsSampling"/>
......
2009-12-22 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* POTFILES.in: added src/dialogs/dialog-analysis-tool-principal-components.c
and src/tools/analysis-principal-components.c
* POTFILES.skip: added src/dialogs/principal-components.glade
2009-12-17 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* POTFILES.skip: added src/dialogs/paste-special.glade
......
......@@ -77,6 +77,7 @@ src/dialogs/dialog-analysis-tool-chi-squared.c
src/dialogs/dialog-analysis-tool-frequency.c
src/dialogs/dialog-analysis-tool-kaplan-meier.c
src/dialogs/dialog-analysis-tool-normality.c
src/dialogs/dialog-analysis-tool-principal-components.c
src/dialogs/dialog-analysis-tool-sign-test.c
src/dialogs/dialog-analysis-tools.c
src/dialogs/dialog-autofilter.c
......@@ -197,6 +198,7 @@ src/tools/analysis-frequency.c
src/tools/analysis-histogram.c
src/tools/analysis-kaplan-meier.c
src/tools/analysis-normality.c
src/tools/analysis-principal-components.c
src/tools/analysis-sign-test.c
src/tools/analysis-tools.c
src/tools/dao.c
......
......@@ -116,6 +116,7 @@ src/dialogs/paste-special.glade
src/dialogs/plugin-manager.glade
src/dialogs/preferences.glade
src/dialogs/print.glade
src/dialogs/principal-components.glade
src/dialogs/random-generation.glade
src/dialogs/random-generation-cor.glade
src/dialogs/rank.glade
......
2009-12-22 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* POTFILES.in: added src/dialogs/dialog-analysis--principal-components.c,
src/tools/analysis-principal-components.c and
src/dialogs/principal-components.glade
2009-12-17 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* POTFILES.in: added src/dialogs/paste-special.glade
......
......@@ -157,6 +157,7 @@ src/dialogs/dialog-analysis-tool-chi-squared.c
src/dialogs/dialog-analysis-tool-frequency.c
src/dialogs/dialog-analysis-tool-kaplan-meier.c
src/dialogs/dialog-analysis-tool-normality.c
src/dialogs/dialog-analysis-tool-principal-components.c
src/dialogs/dialog-analysis-tool-sign-test.c
src/dialogs/dialog-analysis-tools.c
src/dialogs/dialog-autofilter.c
......@@ -240,6 +241,7 @@ src/dialogs/paste-special.glade
src/dialogs/plugin-manager.glade
src/dialogs/preferences.glade
src/dialogs/print.glade
src/dialogs/principal-components.glade
src/dialogs/random-generation.glade
src/dialogs/random-generation-cor.glade
src/dialogs/rank.glade
......@@ -331,6 +333,7 @@ src/tools/analysis-frequency.c
src/tools/analysis-histogram.c
src/tools/analysis-kaplan-meier.c
src/tools/analysis-normality.c
src/tools/analysis-principal-components.c
src/tools/analysis-sign-test.c
src/tools/analysis-tools.c
src/tools/dao.c
......
......@@ -183,6 +183,7 @@
</menu>
<menuitem action="ToolsKaplanMeier"/>
<menuitem action="ToolsNormalityTests"/>
<menuitem action="ToolsPrincipalComponents"/>
<menuitem action="ToolsRanking"/>
<menuitem action="ToolsRegression"/>
<menuitem action="ToolsSampling"/>
......
......@@ -189,6 +189,7 @@
</menu>
<menuitem action="ToolsKaplanMeier"/>
<menuitem action="ToolsNormalityTests"/>
<menuitem action="ToolsPrincipalComponents"/>
<menuitem action="ToolsRanking"/>
<menuitem action="ToolsRegression"/>
<menuitem action="ToolsSampling"/>
......
2009-12-22 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* dialog-analysis-tool-principal-components.c: new
* principal-components.glade: new
* Makefile.am: add the above
* dialogs.h (dialog_principal_components_tool): new
* help.h (GNUMERIC_HELP_LINK_PRINCIPAL_COMPONENTS): new
2009-12-19 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* paste-special.glade: eanble flip h and v
......
......@@ -30,6 +30,7 @@ base_files = \
dialog-analysis-tool-frequency.c \
dialog-analysis-tool-kaplan-meier.c \
dialog-analysis-tool-normality.c \
dialog-analysis-tool-principal-components.c \
dialog-analysis-tool-sign-test.c \
dialog-autofilter.c \
dialog-autoformat.c \
......@@ -137,12 +138,11 @@ glade_DATA = \
merge.glade \
moving-averages.glade \
normality-tests.glade \
sign-test.glade \
sign-test-two.glade \
paste-names.glade \
paste-special.glade \
plugin-manager.glade \
preferences.glade \
principal-components.glade \
rank.glade \
random-generation.glade \
random-generation-cor.glade \
......@@ -155,6 +155,8 @@ glade_DATA = \
sheet-order.glade \
sheet-resize.glade \
shuffle.glade \
sign-test.glade \
sign-test-two.glade \
so-button.glade \
so-radiobutton.glade \
so-checkbox.glade \
......
/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* dialog-analysis-tool-principal-components.c:
*
* Authors:
* Andreas J. Guelzow <aguelzow@taliesin.ca>
*
* (C) Copyright 2009 by Andreas J. Guelzow <aguelzow@pyrshep.ca>
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gnumeric-config.h>
#include <glib/gi18n-lib.h>
#include <gnumeric.h>
#include "dialogs.h"
#include "analysis-principal-components.h"
#include "analysis-tools.h"
#include <workbook.h>
#include <workbook-control.h>
#include <wbc-gtk.h>
#include <workbook-view.h>
#include <gui-util.h>
#include <parse-util.h>
#include <gnm-format.h>
#include <tool-dialogs.h>
#include <dao-gui-utils.h>
#include <sheet.h>
#include <expr.h>
#include <number-match.h>
#include <ranges.h>
#include <selection.h>
#include <value.h>
#include <commands.h>
#include "help.h"
#include <widgets/gnm-dao.h>
#include <widgets/gnumeric-expr-entry.h>
#include <glade/glade.h>
#include <string.h>
#include <gtk/gtk.h>
#define PRINCIPAL_COMPONENTS_KEY "analysistools-principal-components-dialog"
static char const * const grouped_by_group[] = {
"grouped_by_row",
"grouped_by_col",
"grouped_by_area",
NULL
};
static void
principal_components_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget *dummy,
GenericToolState *state)
{
GSList *input_range;
/* Checking Input Range */
input_range = gnm_expr_entry_parse_as_list (
GNM_EXPR_ENTRY (state->input_entry), state->sheet);
if (input_range == NULL) {
gtk_label_set_text (GTK_LABEL (state->warning),
_("The input range is invalid."));
gtk_widget_set_sensitive (state->ok_button, FALSE);
return;
} else
range_list_destroy (input_range);
/* Checking Output Page */
if (!gnm_dao_is_ready (GNM_DAO (state->gdao))) {
gtk_label_set_text (GTK_LABEL (state->warning),
_("The output specification "
"is invalid."));
gtk_widget_set_sensitive (state->ok_button, FALSE);
return;
}
gtk_label_set_text (GTK_LABEL (state->warning), "");
gtk_widget_set_sensitive (state->ok_button, TRUE);
return;
}
/**
* principal_components_tool_ok_clicked_cb:
* @button:
* @state:
*
**/
static void
principal_components_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget *button,
GenericToolState *state)
{
data_analysis_output_t *dao;
analysis_tools_data_generic_t *data;
char *text;
GtkWidget *w;
if (state->warning_dialog != NULL)
gtk_widget_destroy (state->warning_dialog);
data = g_new0 (analysis_tools_data_generic_t, 1);
dao = parse_output (state, NULL);
data->input = gnm_expr_entry_parse_as_list (
GNM_EXPR_ENTRY (state->input_entry), state->sheet);
data->group_by = gnumeric_glade_group_value (state->gui, grouped_by_group);
w = glade_xml_get_widget (state->gui, "labels_button");
data->labels = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
if (cmd_analysis_tool (WORKBOOK_CONTROL (state->wbcg), state->sheet,
dao, data, analysis_tool_principal_components_engine)) {
text = g_strdup_printf (
_("An unexpected error has occurred: %d."), data->err);
error_in_entry ((GenericToolState *) state,
GTK_WIDGET (state->input_entry), text);
g_free (text);
range_list_destroy (data->input);
g_free (dao);
g_free (data);
} else
gtk_widget_destroy (state->dialog);
return;
}
/**
* dialog_principal_components_tool:
* @wbcg:
* @sheet:
*
* Show the dialog (guru).
*
**/
int
dialog_principal_components_tool (WBCGtk *wbcg, Sheet *sheet)
{
GenericToolState *state;
char const * plugins[] = { "Gnumeric_fnstat",
"Gnumeric_fnmath",
"Gnumeric_fnlogical",
NULL};
if ((wbcg == NULL) ||
gnm_check_for_plugins_missing (plugins, wbcg_toplevel (wbcg)))
return 1;
/* Only pop up one copy per workbook */
if (gnumeric_dialog_raise_if_exists (wbcg, PRINCIPAL_COMPONENTS_KEY))
return 0;
state = g_new0 (GenericToolState, 1);
if (dialog_tool_init (state, wbcg, sheet,
GNUMERIC_HELP_LINK_PRINCIPAL_COMPONENTS,
"principal-components.glade", "PrincipalComponents",
_("Could not create the Principal Components Analysis Tool dialog."),
PRINCIPAL_COMPONENTS_KEY,
G_CALLBACK (principal_components_tool_ok_clicked_cb), NULL,
G_CALLBACK (principal_components_tool_update_sensitivity_cb),
GNM_EE_SINGLE_RANGE))
return 0;
gnm_dao_set_put (GNM_DAO (state->gdao), TRUE, TRUE);
principal_components_tool_update_sensitivity_cb (NULL, state);
tool_load_selection ((GenericToolState *)state, TRUE);
return 0;
}
......@@ -93,6 +93,7 @@ int dialog_frequency_tool (WBCGtk *wbcg, Sheet *sheet);
int dialog_kaplan_meier_tool (WBCGtk *wbcg, Sheet *sheet);
int dialog_normality_tool (WBCGtk *wbcg, Sheet *sheet);
int dialog_chi_square_tool (WBCGtk *wbcg, Sheet *sheet, gboolean independence);
int dialog_principal_components_tool (WBCGtk *wbcg, Sheet *sheet);
typedef enum {
SIGNTEST_1 = 1,
......
......@@ -145,6 +145,7 @@
#define GNUMERIC_HELP_LINK_HISTOGRAM "sect-analysis-statistical"
#define GNUMERIC_HELP_LINK_ANOVA_SINGLE_FACTOR "sect-analysis-statistical"
#define GNUMERIC_HELP_LINK_ANOVA_TWO_FACTOR "sect-analysis-statistical"
#define GNUMERIC_HELP_LINK_PRINCIPAL_COMPONENTS "sect-analysis-statistical"
/* dialog-analysis-tool-chi-squared.c */
#define GNUMERIC_HELP_LINK_CHI_SQUARED "sect-analysis-statistical"
......
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
<widget class="GtkDialog" id="PrincipalComponents">
<property name="title" translatable="yes">Principal Components Analysis</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">8</property>
<child internal-child="action_area">
<widget class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="helpbutton">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-help</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="response_id">0</property>
</widget>
</child>
<child>
<widget class="GtkButton" id="cancelbutton">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-cancel</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="response_id">0</property>
</widget>
</child>
<child>
<widget class="GtkButton" id="okbutton">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-ok</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="response_id">0</property>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
<child>
<widget class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="show_tabs">True</property>
<property name="show_border">True</property>
<property name="tab_pos">GTK_POS_TOP</property>
<property name="scrollable">False</property>
<property name="enable_popup">False</property>
<child>
<widget class="GtkTable" id="input-table">
<property name="border_width">12</property>
<property name="visible">True</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="homogeneous">False</property>
<property name="row_spacing">6</property>
<property name="column_spacing">12</property>
<child>
<widget class="GtkLabel" id="var1-label">
<property name="visible">True</property>
<property name="label" translatable="yes">_Input range:</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_RIGHT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">5</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="label" translatable="yes">Grouped by:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_CENTER</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">5</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="labels_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Labels</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="vbox2">
<property name="visible">True</property>
<property name="homogeneous">True</property>
<property name="spacing">0</property>
<child>
<widget class="GtkRadioButton" id="grouped_by_col">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Columns</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="active">True</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="grouped_by_row">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Rows</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<property name="group">grouped_by_col</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="grouped_by_area">
<property name="visible">False</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Areas</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<property name="group">grouped_by_col</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options">fill</property>
</packing>
</child>
</widget>
<packing>
<property name="tab_expand">False</property>
<property name="tab_fill">True</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">Input</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="type">tab</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="dao">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="tab_expand">False</property>
<property name="tab_fill">True</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="label" translatable="yes">Output</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="type">tab</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="warnings">
<property name="visible">True</property>
<property name="label" translatable="yes"></property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">True</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
......@@ -7856,7 +7856,7 @@ gnm_matrix_eigen (gnm_float **matrix, gnm_float **eigenvectors, gnm_float *eigen
changed[i] = TRUE;
}
while (state != 0) {
while (size > 1 && state != 0) {
int k, l, m = 0;
gnm_float c, s, y, pivot, t;
......
2009-12-22 Andreas J. Guelzow <aguelzow@pyrshep.ca>
* analysis-principal-components.c: new
* analysis-principal-components.h: new
* Makefile.am: add the above
* analysis-tools.c (analysis_tool_table): make non-static and add
full_table argument. Change all callers.
* analysis-tools.h (analysis_tool_table): new
2009-12-15 Morten Welinder <terra@gnome.org>
* Release 1.9.17
......
......@@ -29,6 +29,8 @@ libtools_la_SOURCES = \
analysis-kaplan-meier.h \
analysis-normality.c \
analysis-normality.h \
analysis-principal-components.c \
analysis-principal-components.h \
analysis-sign-test.c \
analysis-sign-test.h \
analysis-tools.c \
......
/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* analysis-principal-components.c:
*
* Author: