You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: fisher.m
    path of file: ./repos/supermodeling/算法代码案例/第10章 判别分析
    
    the code of the file until where you have to start completion: function [outclass,TabCan,TabL,TabCon,TabM,TabG,trainscore] = fisher(sampledata,training,group,contri)
%FISHER 判别分析.
%   class = fisher(sampledata,training,group) 根据训练样本training构造判别式，
%   利用所有判别式对待判样品sampledata进行判别. sampledata和training是具有相同
%   列数的矩阵，它们的每一行对应一个观测，每一列对应一个变量. group是training对
%   应的分组变量，它的每一个元素定义了training中相应观测所属的类. group可以是一
%   个分类变量，数值向量，字符串数组或字符串元胞数组. training和group必须具有相
%   同的行数. fisher函数把group中的NaN或空字符串作为缺失数据，从而忽略training
%   中相应的观测. class中的每个元素指定了sampledata中的相应观测所判归的类,它和
%   group具有相同的数据类型. 
%
%   class = fisher(sampledata,training,group,contri) 根据累积贡献率不低于
%   contri，确定需要使用的判别式个数，默认情况下，使用所有判别式进行判别. contri
%   是一个在(0, 1]区间内取值的标量，用来指定累积贡献率的下限. 
%
%   [class, TabCan] = fisher(...)以表格形式返回所用判别式的系数向量，若contri
%   取值为1，则返回所有判别式的系数向量. TabCan是一个元胞数组，形如

    
function [outclass,TabCan,TabL,TabCon,TabM,TabG,trainscore] = fisher(sampledata,training,group,contri)
%FISHER 判别分析.
%   class = fisher(sampledata,training,group) 根据训练样本training构造判别式，
%   利用所有判别式对待判样品sampledata进行判别. sampledata和training是具有相同
%   列数的矩阵，它们的每一行对应一个观测，每一列对应一个变量. group是training对
%   应的分组变量，它的每一个元素定义了training中相应观测所属的类. group可以是一
%   个分类变量，数值向量，字符串数组或字符串元胞数组. training和group必须具有相
%   同的行数. fisher函数把group中的NaN或空字符串作为缺失数据，从而忽略training
%   中相应的观测. class中的每个元素指定了sampledata中的相应观测所判归的类,它和
%   group具有相同的数据类型. 
%
%   class = fisher(sampledata,training,group,contri) 根据累积贡献率不低于
%   contri，确定需要使用的判别式个数，默认情况下，使用所有判别式进行判别. contri
%   是一个在(0, 1]区间内取值的标量，用来指定累积贡献率的下限. 
%
%   [class, TabCan] = fisher(...)以表格形式返回所用判别式的系数向量，若contri
%   取值为1，则返回所有判别式的系数向量. TabCan是一个元胞数组，形如
%       'Variable'    'can1'       'can2'   
%       'x1'          [-0.2087]    [ 0.0065]
%       'x2'          [-0.3862]    [ 0.5866]
%       'x3'          [ 0.5540]    [-0.2526]
%       'x4'          [ 0.7074]    [ 0.7695]

%   [class, TabCan, TabL] = fisher(...)以表格形式返回所有特征值，贡献率，累积
%   贡献率等. TabL是一个元胞数组，形如
%       'Eigenvalue'    'Difference'    'Proportion'    'Cumulative'
%       [   32.1919]    [   31.9065]    [    0.9912]    [    0.9912]
%       [    0.2854]              []    [    0.0088]    [         1]
%
%   [class, TabCan, TabL, TabCon] = fisher(...)以表格形式返回混淆矩阵（包含总
%   的分类信息的矩阵）. TabCon是一个元胞数组，形如
%       'From/To'       'setosa'    'versicolor'    'virginica'
%       'setosa'        [    50]    [         0]    [        0]
%       'versicolor'    [     0]    [        48]    [        2]
%       'virginica'     [     0]    [         1]    [       49]
%
%   [class, TabCan, TabL, TabCon, TabM] = fisher(...)以表格形式返回误判矩阵. 
%   TabM是一个元胞数组，形如
%       'Obj'    'From'          'To'        
%       [ 71]    'versicolor'    'virginica' 
%       [ 84]    'versicolor'    'virginica' 
%       [134]    'virginica'     'versicolor'
%
%   [class, TabCan, TabL, TabCon, TabM, TabG] = fisher(...)将所用判别式作用
%   在各组的组均值上，得到组均值投影矩阵，以表格形式返回这个矩阵. TabG是一个元胞
%   数组，形如
%       'Group'         'can1'       'can2'  
%       'setosa'        [-1.3849]    [1.8636]
%       'versicolor'    [ 0.9892]    [1.6081]
%       'virginica'     [ 1.9852]    [1.9443]

%   [class, TabCan, TabL, TabCon, TabM, TabG, trainscore] = fisher(...)返回
%   训练样品所对应的判别式得分trainscore. trainscore的第一列为各训练样品原本所
%   属类的类序号，第i+1列为第i个判别式得分.
%
%   Copyright 2009 xiezhh.
%   $Revision: 1.0.0.0 $  $Date: 2009/10/03 10:40:34 $

if nargin < 3
    error('错误：输入参数太少，至少需要3个输入.');
end