热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解释结构模型的php代码-PHP源码

解释结构模型的php代码
php代码

array(1,2,2,3,)2=>array(4,6,5,7)),6)
	 * 对值大于1的强制转换成模糊数字型
	 *  new ism_mat(6) 类似的给出一个6*6的矩阵
	 ***********************************************************************/
	function ism_mat()
	{
		$nArgs = func_num_args();
		if ($nArgs == 0)
		{
			$array_number=array();
			$this->element = 3;
			$this->numRows = 3; //行    从   获得第二
			$this->numColumns = 3;//列  从   第二个参数获
		}
		if ($nArgs == 1 )
		{
			if(is_array(func_get_arg(0)))
			{
				$array_number = func_get_arg(0);
			}
			else
			{
				if(is_int(func_get_arg(0)))
				{
					$this->element = func_get_arg(0);
				}
				$array_number=array();
			}
		}
		if($nArgs == 2) //如果是2
		{
			$array_number = func_get_arg(0);
			$this->element = func_get_arg(1);  //要素  从第二个参数获
			$this->numRows = func_get_arg(1); //行    从   获得第二
			$this->numColumns = func_get_arg(1);//列  从   第二个参数获
		}
		if($nArgs > 2) //如果是3
		{
			$array_number = func_get_arg(0);
			$this->element = func_get_arg(1);  //要素  从第二个参数获
			$this->numRows = func_get_arg(1); //行    从   获得第二
			$this->numColumns = func_get_arg(1);//列  从   第二个参数获
			$this->element_name=func_get_arg(2);//要素的名称
		}
		$numberColumns = 0; //
		$numberRows = 0;    //
		if(empty($array_number) == false) //数组内容不为空
		{
			foreach($array_number as $i => $rows) //检查
			{
				foreach($rows as $j => $number) //如果值为0则移除
				{
					if($number != 0 && abs($number)<=1 )
					{
						$this->array_number[$i][$j] = $number;
					}
					if ($number != 0 && abs($number)>1)
					{
						$this->array_number[$i][$j] = 1;
					}
					if($j >= $numberColumns)
					{
						$numberColumns = $j;
					}
				}
				if($i >=$numberRows)
				{
					$numberRows = $i;
				}
			}
			//php的数组下标定义为0开始,加1符合数学上的习惯
			$numberRows++;
			$numberColumns++;
		}
		$name_count=count($this->element_name);
		$maxlen=max($numberRows , $this->numRows,$numberColumns ,$this->numColumns,$this->element,$name_count);
		$this->numRows = $maxlen;
		$this->numColumns = $maxlen;
		$this->element = $maxlen;
		if($name_count <=$maxlen)
		{
			$i=0;
			$name=$this->element_name;
			//print_r($name);
			unset($this->element_name);
			foreach($name as $v)
			{
				$this->element_name[$i]=$v;
				$i++;
			}

			for ($i=$name_count;$i<$maxlen;$i++)
			{
				$this->element_name[$i]=$i.&#39;号&#39;;
			}
		}
	}


	/***************************************************************
	 * ISM矩阵变换
	 * 输入新的名字数组$arrayname(name1…… name_n )
	 * 这个名字数组必须与原来的 ism对象中的 一样,顺序
	 *  根据新的排列,返回一个新的 ism矩阵
	 **************************************************************/
	function transform_by_name($new_name_array)
	{
		$old_name_array=$this->element_name;
		$numb=$this->array_number;
		$result = array_diff($old_name_array, $new_name_array);
		$e=$this->element;
		if(empty($result)== true && $this->element==count($new_name_array))
		{
			//检查输入的名字列表是

			$get_name_old_num=array();
			for($k=0;$k<$e;$k++)
			{
				//获得名称原来的序号
				$get_name_old_num[$k] = array_search($new_name_array[$k], $old_name_array);
			}
			for($i=0;$i<$e;$i++)
			{
				for($j=0;$j<$e;$j++)
				{
					$old_x=$get_name_old_num[$i];
					$old_y=$get_name_old_num[$j];
					if(empty($numb[$old_x][$old_y]) == false)
					{
						$new_array_number[$i][$j]=1;
					}
					else
					{
						unset($new_array_number[$i][$j]);
					}
				}
			}
		}
		else
		{
			echo" 输入的名字跟原来变换的不同,所有的名字要相同!";
		}
		$new_mat=new ism_mat($new_array_number,$e,$new_name_array);
		return $new_mat ;
	}


	/***************************************************************
	 *元素互换,获得一个新的矩阵
	 *  0 7   表示第1个与 第8个交换
	 **************************************************************/
	function exchange_e_by_num($num_1, $num_2)
	{
		$e=$this->element;
		$new_mat=new ism_mat($this->array_number,$e,$this->element_name);
		if($num_1<$e and $num_2<$e and $num_1!=$num_2)
		{
			for($i=0;$i<$e;$i++)
			{
				if($i!=$num_1 and $i!=$num_2)
				{
					$new_mat->array_number[$num_2][$i]=$this->array_number[$num_1][$i];
					$new_mat->array_number[$i][$num_2]=$this->array_number[$i][$num_1];
					$new_mat->array_number[$num_1][$i]=$this->array_number[$num_2][$i];
					$new_mat->array_number[$i][$num_1]=$this->array_number[$i][$num_2];
				}
				else
				{
					$new_mat->array_number[$num_2][$num_1]=$this->array_number[$num_1][$num_2];
					$new_mat->array_number[$num_2][$num_2]=$this->array_number[$num_1][$num_1];
					$new_mat->array_number[$num_1][$num_1]=$this->array_number[$num_2][$num_2];
					$new_mat->array_number[$num_1][$num_2]=$this->array_number[$num_2][$num_1];
				}
			}
			$new_mat->element_name[$num_2]=$this->element_name[$num_1];
			$new_mat->element_name[$num_1]=$this->element_name[$num_2];
		}

		return $new_mat ;
	}

	/***************************************************************
	 * 通过元素名称交换,获得 ism中的布尔矩阵的值,返回矩阵中所有的
	 **************************************************************/
	function exchange_e_by_name($name_1, $name_2)
	{
		$e=$this->element;
		$num_1 = array_search($name_1, $this->element_name);
		$num_2 = array_search($name_2, $this->element_name);
		//print_r($num_2);
		if( $num_1>=0 and $num_2>=0 )
		{
			$new_mat=$this->exchange_e_by_num($num_1,$num_2);
			//print_r($new_mat);
		}
		else
		{
			echo "输入的要换的要素名称有错误,滴点眼药水,看看。为了不影响您计算,返回原来的矩阵";
			//$new_mat=$this;
			//$new_mat=new ism_mat($this->array_number,$this->element,$this->element_name);
		}

		return $new_mat ;
	}
	/***************************************************************
	 * 获得 ism中的布尔矩阵的值,返回矩阵中所有的
	 **************************************************************/
	function get_data()
	{
		for($i = 0; $i <$this->element; $i++)
		{
			for($j = 0; $j <$this->element; $j++)
			{
				if(empty($this->array_number[$i][$j]) == false)
				{
					$the_numbers[$i][$j] = $this->array_number[$i][$j];
					$the_numbers[$i][$j]>=1 ? 1: $the_numbers[$i][$j];
					$the_numbers[$i][$j]<=0.0001? 0: $the_numbers[$i][$j];
					$the_numbers[$i][$j]==&#39;&#39; ? 0:$the_numbers[$i][$j];
				}
				else
				{
					$the_numbers[$i][$j] = 0;
				}
			}
		}
		return $the_numbers;
	}

	/***************************************************************
	 * 得到相乘矩阵 即原始矩阵+单位矩阵
	 **************************************************************/
	function b()
	{
		for($i = 0; $i <$this->element; $i++)
		{
			for($j = 0; $j <$this->element; $j++)
			{
				if(empty($this->array_number[$i][$j]) == false )
				{
					$the_numbers[$i][$j] = $this->array_number[$i][$j];
					$the_numbers[$i][$j]>=1?1:$the_numbers[$i][$j];
					$the_numbers[$i][$j]<=0?0:$the_numbers[$i][$j];

				}
				else
				{
					$the_numbers[$i][$j] = 0;
				}

			}
		}
		for($i = 0; $i <$this->element; $i++)
		{
			$the_numbers[$i][$i]=1;
		}
		$the_b_mat=new ism_mat($the_numbers,$this->element,$this->element_name);
		return $the_b_mat;
	}


	/**************************************************************************
	 * 返回某个矩阵坐标的值  即对应行与列元素的值,注意下标
	 *************************************************************************/
	function get_value($i, $j)
	{
		$the_value = 0;
		if($i-1 <$this->get_num_rows() and $j-1 <$this->get_num_columns())
		{
			if(empty($this->array_number[$i-1][$j-1]) == false)
			{
				$the_value = $this->number[$i-1][$j-1];
			}
		}
		else
		{
			echo "

\n\n\n 搞错了注意参数,超过了ism矩阵中的要素的值的范围 !\n\n\n\

"; } return $the_value; } /************************************************************************** * 返回ism_矩阵的求解可达矩阵,过程中所有的矩阵 * 返回矩阵格式对象 * 格式为 array(1=>ism_mat(data1), 2=>ism_mat(data2),……) *************************************************************************/ function get_r_mat_step_data() { $i=1; $i_mat= $this->i(); $b=$this->plus($i_mat); $r_mat_step_data[1]=$b; while ($i <50 and $r_mat_step_data[$i]!=$r_mat_step_data[$i-1]) { $r_mat_step_data[$i+1]=$r_mat_step_data[$i]->muti($b); $i++; } return $r_mat_step_data; } /************************************************************************** * 返回可达矩阵 * 矩阵 *************************************************************************/ function r_mat() { $r_step=$this->get_r_mat_step_data(); $the_last=$r_step[count($r_step)-1]; $the_reached_matrix =new ism_mat ($the_last->array_number,$the_last->element,$the_last->element_name); return $the_reached_matrix; } /************************************************************************** * 返回层次分解模型的各个步骤,超级傻逼的一个过程!!!此过程为结果优先 * 返回 一个数组 * 格式为 array(1=>array( 可达矩阵(), 可达矩阵转置, 上面两个的交集, lev_e=), * 2=>array( 可达矩阵(), 可达矩阵转置, 上面两个的交集, lev_e=), * ) * *************************************************************************/ function get_r_f_level_data() { if($this->is_r_mat($this)==true) { $reached_matrix=$this; } else { $reached_matrix=$this->r_mat();//可达矩阵 } $reached_transpose_matrix = $reached_matrix->transpose();//可达矩阵的转置矩阵 $reached_meet_matrix = $reached_matrix->meet($reached_transpose_matrix);//交集矩阵 $array_e_zero =array(); //$the_mat_level_data[1]= array(r_mat=>$reached_matrix,t_mat=>$reached_transpose_matrix,m_mat=>$reached_meet_matrix,lev=>$level_element); //print_r($the_mat_level_data[1]); $j=1; do { $array_e_zero=array(); for ($len=0;$len<$reached_matrix->element;$len++) { $a_line = $reached_matrix->array_number[$len]; $meet_line = $reached_meet_matrix->array_number[$len]; if($a_line==$meet_line and empty($a_line)==false) { $array_e_zero[$len]=$len; } } if (empty($array_e_zero)==false) { $the_mat_level_data[$j][r_mat]=$reached_matrix; $the_mat_level_data[$j][t_mat]=$reached_transpose_matrix; $the_mat_level_data[$j][m_mat]=$reached_meet_matrix; $the_mat_level_data[$j][lev]=$array_e_zero; $reached_matrix = $reached_matrix->set_e_zero($array_e_zero); $reached_transpose_matrix = $reached_transpose_matrix->set_e_zero($array_e_zero); $reached_meet_matrix=$reached_meet_matrix->set_e_zero($array_e_zero); } $j++; } while( empty($array_e_zero)==false and $j <= $reached_matrix->element); return $the_mat_level_data; } /************************************************************************** * 返回层次分解模型的各个步骤,的一个过程!!!此过程为原因优先g_frist_ * 返回 一个数组 * 格式为 array(1=>array( 可达矩阵(), 可达矩阵转置, 上面两个的交集, lev_e=), * 2=>array( 可达矩阵(), 可达矩阵转置, 上面两个的交集, lev_e=), * ) *************************************************************************/ function get_g_f_level_data() { if($this->is_r_mat($this)==true) { $reached_matrix=$this; } else { $reached_matrix=$this->r_mat();//可达矩阵 } $reached_transpose_matrix = $reached_matrix->transpose();//可达矩阵的转置矩阵 $reached_meet_matrix = $reached_matrix->meet($reached_transpose_matrix);//交集矩阵 $array_e_zero =array(); //$the_mat_level_data[1]= array(r_mat=>$reached_matrix,t_mat=>$reached_transpose_matrix,m_mat=>$reached_meet_matrix,lev=>$level_element); //print_r($the_mat_level_data[1]); $j=1; do { $array_e_zero=array(); for ($len=0;$len<$reached_matrix->element;$len++) { $a_line = $reached_transpose_matrix->array_number[$len];//就这个地方 $meet_line = $reached_meet_matrix->array_number[$len]; if($a_line==$meet_line and empty($a_line)==false) { $array_e_zero[$len]=$len; } } if (empty($array_e_zero)==false) { $the_mat_level_data[$j][r_mat]=$reached_matrix; $the_mat_level_data[$j][t_mat]=$reached_transpose_matrix; $the_mat_level_data[$j][m_mat]=$reached_meet_matrix; $the_mat_level_data[$j][lev]=$array_e_zero; $reached_matrix = $reached_matrix->set_e_zero($array_e_zero); $reached_transpose_matrix = $reached_transpose_matrix->set_e_zero($array_e_zero); $reached_meet_matrix=$reached_meet_matrix->set_e_zero($array_e_zero); } $j++; } while( empty($array_e_zero)==false and $j <= $reached_matrix->element); return $the_mat_level_data; } /************************************************************************** * 返回ism的区域划分,也就是,系统个数,各个系统有什么要素组成 * 返回二维数组, *************************************************************************/ function get_group() { $arraygroup=array(); $bmatrix= $this->b(); $transpose=$this->transpose(); $u=$bmatrix->plus($transpose); $g=$u->r_mat(); $data=$g->get_data(); for ($k=0;$k$v) { if($v==1) { $arraygroup[$i][$j]=$key; } $j++; } $i++; } return $arraygroup; } /***************************************************************************** * 获得矩阵内最大的独立系统 * 返回其中的 ***************************************************************************/ function get_max_group_mat () { $arraygroup=$this->get_group(); $size=array(); foreach($arraygroup as $k=>$v) { $size[$k]=count($v); } $max_group_size=max($size); $max_group_size_index=array_search($max_group_size, $size); $max_group=$arraygroup[$max_group_size_index]; $the_tmp_mat= $this; $the_max_group_mat=$the_tmp_mat->group_mat_by_num ($max_group); $the_max_group_mat= new ism_mat($the_max_group_mat->array_number,$the_max_group_mat->element,$the_max_group_mat->element_name); return $the_max_group_mat; } /***************************************************************************** * 输入一个数组 * 或者输入一组 数字的系列。 如 0、1、2、3、4、没有检查重复度,请调用的时候自动检测 * 矩阵是下标以 0开始的 * 返回 矩阵,要素是里面对应的要素的 * 给出一个新的矩阵, 要素为输入的里面的要素 ***************************************************************************/ function group_mat_by_num () { $nArgs = func_num_args(); // print_r($nArgs); if ($nArgs == 0) { echo "没有输入的要素"; } if ($nArgs == 1 ) { if(is_array(func_get_arg(0))) { $array_num = func_get_arg(0); } elseif(is_int(func_get_arg(0))) { $array_num[0] =func_get_arg(0); } else { echo"输入要素的格式错误"; } } if ( $nArgs >1 ) { for($i=0;$i<$nArgs;$i++) { $array_num[$i]=func_get_arg($i); } } //对输入的要素的名称排序 sort($array_num); for ($i=0; $ielement_name[$array_num[$i]]; } // print_r($element_name); // echo &#39;
&#39;; // print_r($array_num); $the_new_group_mat=new ism_mat(array(),count($array_num),$element_name); $the_new_e= count($array_num); for ($x=0; $x<$the_new_e;$x++) { $old_x=$array_num[$x]; for ($y=0; $y<$the_new_e;$y++) { $old_y=$array_num[$y]; $the_new_group_mat->array_number[$x][$y]=$this->array_number[$old_x][$old_y]; } } $the_new_group_mat=new ism_mat($the_new_group_mat->array_number,count($array_num),$element_name); return $the_new_group_mat; } /************************************************************************** * 返回ism的区域划分,也就是,系统个数,各个系统有什么要素组成 * 返回二维数组, * 数组由,要素名称组成 *************************************************************************/ function get_group_e_name() { $arraygroup=array(); $bmatrix= $this->b(); $transpose=$this->transpose(); $u=$bmatrix->plus($transpose); $g=$u->r_mat(); $data=$g->get_data(); for ($k=0;$k$v) { if($v==1) { $arraygroup[$i][$j]=$key; } $j++; } $i++; } foreach($arraygroup as $i=>$group) { foreach($group as $j=>$num) { $arraygroup_name[$i][$j]=$this->element_name[$num]; } } return $arraygroup_name; } /***************************************************************************** * 输入的是一个数组,数组中每个值是整数 为要素素的序号 * * 这个东西小心使用,比如删除 array(0,0,0,0,0,0,0,0,0,0)表示一直删除第一个要素 *意义 **************************************************************************/ function del_e_by_some_num ($array_element_num) { $the_deduce=$this; foreach($array_element_num as $v) { $the_deduce=$the_deduce->del_e_by_num($v); } return $the_deduce; } /***************************************************************************** * 输入的是一个元素,值是整数 为要素的序号 * 矩阵是下标以 0开始的 * 返回 矩阵,对应的行与列删除,其它值,对应的左移,与右移动, * 矩阵变小 ***************************************************************************/ function del_e_by_num ($element_num) { $e=$this->element; $element_name=$this->element_name; $new_element=$e-1; $new_element_name=array(); $new_array_number=array(); if(0<=$element_num and $element_num<$e) { for ($i=0;$i<$element_num;$i++) { $new_element_name[$i]=$element_name[$i]; } for ($i=$element_num;$i<$e-1;$i++) { $new_element_name[$i]=$element_name[$i+1]; } for ($i=0;$i<$e-1;$i++) { for ($j=0;$j<$e-1;$j++) { if( $i<$element_num and $j<$element_num) { $new_array_number[$i][$j]=$this->array_number[$i][$j]; } elseif( $i<$element_num and $j>=$element_num) { $new_array_number[$i][$j]=$this->array_number[$i][$j+1]; } elseif( $i>=$element_num and $j<$element_num) { $new_array_number[$i][$j]=$this->array_number[$i+1][$j]; } elseif( $i>=$element_num and $j>=$element_num) { $new_array_number[$i][$j]=$this->array_number[$i+1][$j+1]; } } } $the_new_deduce_mat=new ism_mat($new_array_number,$new_element,$new_element_name); } else { echo "

\n\n\n搞错了参数,回去面壁下,认真检查!要删除的要素的值, 的参数请注意!\n\n\n\

"; } //$set_e_zero_mat = new ism_mat($this->array_number,$e ); return $the_new_deduce_mat; } /***************************************************************************** * 输入元素的名称,值是整数 为要素的序号 * 矩阵是下标以 0开始的 * 返回 矩阵,对应的行与列删除,其它值,对应的左移,与右移动, * 矩阵变小 ***************************************************************************/ function del_e_by_name ($name) { $element_num=array_search($name,$this->element_name); $the_new_deduce_mat=$this->del_e_by_num($element_num); return $the_new_deduce_mat; } /***************************************************************************** * 输入元素的名称,值是整数 为要素的序号 * 矩阵是下标以 0开始的 * 返回 矩阵,对应的行与列删除,其它值,对应的左移,与右移动, * 矩阵变小 ***************************************************************************/ function del_e_by_array_name ($arrayname) { $the_new_deduce_mat=$this; foreach($arrayname as $name) { $the_new_deduce_mat=$the_new_deduce_mat->del_e_by_name($name); } return $the_new_deduce_mat; } /***************************************************************************** * 输入一个数组 * 或者输入一组 数字的系列。 如 0、1、2、3、4、没有检查重复度,请调用的时候自动检测 * 矩阵是下标以 0开始的 * 返回 矩阵,对应的行与列删除,其它值,对应的左移,与右移动, * 矩阵变小 ***************************************************************************/ function del_e_by_array_num () { $nArgs = func_num_args(); // print_r($nArgs); if ($nArgs == 0) { echo "没有要删除的要素"; } if ($nArgs == 1 ) { if(is_array(func_get_arg(0))) { $array_num = func_get_arg(0); } elseif(is_int(func_get_arg(0))) { $array_num[0] =func_get_arg(0); } else { echo"输入要素的格式错误"; } } if ( $nArgs >1 ) { for($i=0;$i<$nArgs;$i++) { $array_num[$i]=func_get_arg($i); } } $the_new_deduce_mat=$this; // print_r($array_num); foreach($array_num as $num) { $arrayname[$num]=$the_new_deduce_mat->element_name[$num]; } $the_new_deduce_mat=$the_new_deduce_mat->del_e_by_array_name($arrayname); return $the_new_deduce_mat; } /***************************************************************************** * 输入的是一个数组,这里暂时不做严格边界处理,每个数组必须整 * 矩阵是下标以 0开始的 * 返回 矩阵,对应的行与列清零的矩阵 ***************************************************************************/ function deduce_e_by_ring ($array_element_num) { $e=$this->element; $element_name=$this->element_name; $size=count($array_element_num); if($size<$e) { $new_e=$e-$size+1; } $min_num=min($array_element_num); $set_e_zero_mat = new ism_mat($this->array_number,$e ,$this->element_name); foreach($array_element_num as $i) { $the_group_name=$set_e_zero_mat->element_name[$i].&#39;+&#39;.$the_group_name; } $set_e_zero_mat->element_name[$min_num]=$the_group_name; if( 0<=min($array_element_num) and max($array_element_num)<$this->element ) { foreach( $array_element_num as $the_num) { for($i=0;$i<$e;$i++) { if ($i==$min_num) { for ($j=0;$j<$e;$j++) { if ($set_e_zero_mat->array_number[$the_num][$j]==1 ) { $set_e_zero_mat->array_number[$min_num][$j]=1; } if ( $set_e_zero_mat->array_number[$j][$the_num]==1) { $set_e_zero_mat->array_number[$j][$min_num]=1; } } } } } $the_new_mat=new ism_mat($set_e_zero_mat->array_number,$set_e_zero_mat->element,$set_e_zero_mat->element_name); foreach($array_element_num as $k=>$num) { if($num==$min_num) { unset($array_element_num[$k]); } } $the_new_mat=$the_new_mat->del_e_by_array_num($array_element_num); } else { echo "

\n\n\n搞错了参数,回去面壁下,认真检查!$array_element_num 的参数请注意!\n\n\n\

"; } $the_new_mat=new ism_mat($the_new_mat->array_number,$the_new_mat->element,$the_new_mat->element_name); return $the_new_mat; } /************************************************************************************** * 输入的是一个数组,数组里面为环路 用元素的名称标识,这里没有做严格的重复检查等等,调用的时候请注意 * 矩阵是下标以 0开始的 * 返回 矩阵,对应的行与列清零的矩阵 ***************************************************************************/ function deduce_e_by_ring_name ($array_ring_name) { $array_ring_num=array(); foreach($array_ring_name as $key=>$name) { $array_ring_num[$key]=array_search($name,$this->element_name); } $the_new_mat=$this->deduce_e_by_ring($array_ring_num); return $the_new_mat; } /************************************************************************** * 返回ism的强连通子集,系统中构成环路的个数以及对应的组成 * 本处用的是一个经典的Tarjan算法 http://www.byvoid.com/blog/scc-tarjan/ * Robert Tarjan 的官方网站 http://www.cs.princeton.edu/~ret/ * 返回二维数组, *************************************************************************/ function get_ring_use_Tarjan() { } /************************************************************************** * 返回ism的强连通子集,系统中构成环路的个数以及对应的组成 * 返回二维数组, *************************************************************************/ function get_ring() { $arrayring=array(); $m=$this->r_mat(); //获得可达矩阵 $m_t=$m->transpose(); //可达矩阵的转置矩阵 $u=$m->meet($m_t); //可达矩阵 与 可达矩阵的转置矩阵 的 交集 矩阵 $data=$u->get_data(); for ($k=0;$k$v) { if($v==1) { $arraytmp[$i][$j]=$key; } $j++; } if(count($arraytmp[$i])>1) { $arrayring[$i]=$arraytmp[$i]; } $i++; } return $arrayring; } /************************************************************************** * 返回ism的强连通子集,系统中构成环路的个数以及对应的要素名称 * 返回二维数组, *************************************************************************/ function get_ring_e_name() { $arrayring_e_name=array(); $arrayring_e_number=$this->get_ring(); foreach($arrayring_e_number as $k=>$array_name_index) { foreach($array_name_index as $j=>$num) { $arrayring_e_name[$k][$j]=$this->element_name[$num]; } } return $arrayring_e_name; } /***************************************************************************** * 给矩阵某一行某一列 的关系 赋值 $value 绝对值小于等于1,以后用来拓展的 ***************************************************************************/ function set_value($i, $j, $value) { if($i-1 <$this->get_num_rows() and $j-1 <$this->get_num_columns()) { if($value != 0 and abs($value)<=1) { $this->array_number[$i-1][$j-1] = $value; } elseif(abs($value)>1) { $this->array_number[$i-1][$j-1] = 1; } else { unset($this->array_number[$i-1][$j-1]); } } else { echo "

\n\n\n搞错了参数,回去面壁下,认真检查!set_value 的参数请注意!\n\n\n\

"; } } /***************************************************************************** * 清除某个要素,但是不减少矩阵的大小,注意此过程只是把对应的行与列清零 * 输入的是一个数组,这里暂时不做严格边界处理,每个数组必须整 * 矩阵是下标以 0开始的 * 返回 矩阵,对应的行与列清零的矩阵 ***************************************************************************/ function set_e_zero ($array_element_num) { $e=$this->element; $set_e_zero_mat = new ism_mat($this->array_number,$e ,$this->element_name); if( 0<=min($array_element_num) and max($array_element_num)<$this->element ) { foreach( $array_element_num as $the_num) { for($i=0;$i<$e;$i++) { unset($set_e_zero_mat->array_number[$the_num][$i]); unset($set_e_zero_mat->array_number[$i][$the_num]); } } } else { echo "

\n\n\n搞错了参数,回去面壁下,认真检查!$array_element_num 的参数请注意!\n\n\n\

"; } return $set_e_zero_mat; } /************************************************************************* *随机填充根据矩阵要素的个数按比例填充,大于1的元素 **********************************************************************/ function rand_mat( $rate ) { $random_numbers = array(); $e = $this->element; if($rate==null || $rate<0) { $rate=2; } $totalnum=$rate * $e; for ($i=0; $i<$totalnum; $i++) { $x = mt_rand(0,$e-1); $y = mt_rand(0,$e-1); $random_numbers[$x][$y] = 1; //此处专门用来修改的,比如更改成模糊矩阵的方 } $the_random_matrix = new ism_mat($random_numbers, $e,$this->element_name); return $the_random_matrix; } /******************************************* * 满阵 , 布尔矩阵中所有的值都为 1 *******************************************/ function ones() { $array_fill = array(); $e= $this->element; for($i = 0; $i <$e; $i++) { for($j = 0; $j <$e; $j++) { $array_fill[$i][$j] = 1; } } $a_matrix_fill_Ones= new ism_mat($array_fill,$e,$this->element_name); return $a_matrix_fill_ones; } /***************************************************** * 我日个去,查了下单位矩阵居然是叫 identity matrix. * 矩阵中对角线的全部为1,其它的全部为0 *****************************************************/ function i() { $e = $this->element; for($i = 0; $i <$e; $i++) { $id_numbers[$i][$i] = 1; } $the_identity_matrix = new ism_mat($id_numbers, $e,$this->element_name); return $the_identity_matrix; } /*************************************************** * 计算转置矩阵 A_ij 变成 A_ji * A&#39; is $A->transpose() 转置矩阵 *****************************************************/ function transpose() { foreach($this->array_number as $i => $row) { foreach($row as $j => $number) { $the_transpose_data[$j][$i] = $number; } } $the_transpose = new ism_mat($the_transpose_data, $this->element,$this->element_name); return $the_transpose; } /************************************************************************ * 布尔矩阵相乘没有运用到具体的算子 采用的是大于1就等于1的截 的方 * A x B is $A->muti($B) 乘运算⊙(product *如果对某个k,有 a_ik =1且b_kj =1,1≤k≤element ************************************************************************/ function muti($some_mat) { $easier = $some_mat->transpose(); if($this->get_num_columns() == $some_mat->get_num_rows() and $this->get_num_rows() == $some_mat->get_num_columns()) { foreach($this->array_number as $i => $row) { foreach($easier->array_number as $j => $column) { $total = 0; foreach($row as $k => $number) { if(empty($column[$k]) == false) { $total += $number * $column[$k]; } } $the_product_data[$i][$j] = $total; if ($the_product_data[$i][$j]>1) { $the_product_data[$i][$j]=1; } } } $the_product = new ism_mat($the_product_data,$this->get_num_columns(),$this->element_name); } else { echo "\n\n\n 貌似出错了,请检查参数 \n\n\n"; } return $the_product; } /************************************************************************ * 布尔矩阵交集没有运用到具体的算子 采用的是大于1就等于1的截 的方 * A x B is $A->meet($B) *如果对某个k,有 a_ij =1且b_ij =1, c_ij =1 否则为0 ************************************************************************/ function meet($some_mat) { $e=$this->element; if($this->get_num_columns() == $some_mat->get_num_rows() and $this->get_num_rows() == $some_mat->get_num_columns()) { for($i=0; $i<$e;$i++) { for($j=0; $j<$e;$j++) { if(empty($this->array_number[$i][$j]) == false) { if(empty($some_mat->array_number[$i][$j]) == false) { if($this->array_number[$i][$j]==1 and $some_mat->array_number[$i][$j]==1) { $the_data[$i][$j]=1; } } } else { if(empty($some_mat->array_number[$i][$j]) == false) { $the_data[$i][$j]=0; } } } } $the_meet_mat = new ism_mat($the_data,$e,$this->element_name); } else { echo "\n\n\n 貌似出错了,请检查参数 \n\n\n"; } return $the_meet_mat; } /*********************************************** * 矩阵大小检查,检查矩阵的行与列,是 ************************************************/ function size_eq($some_mat) { $return = false; if ($some_mat->get_num_rows() == $this->get_num_rows() and $some_mat->get_num_columns() == $this->get_num_columns()) { $return = true; } return $return; } /************************************************** * 检查是否为可达矩阵 自身相乘 不变认为是可达矩阵 ************************************************/ function is_r_mat($some_mat) { $return = false; $check =$some_mat->muti($some_mat); if ( $check == $some_mat) { $return = true; } return $return; } /************************************************* * 一个常数乘以矩阵 A * n = $A->s_times($n) *没有什么鸟用,一个中间 ************************************/ function s_times($value) { $the_mat = new ism_mat($this->array_number, $this->element,$this->element_name); foreach($this->array_number as $i => $column) { foreach($column as $j => $number) { $the_mat->array_number[$i][$j] *= $value; } } return $the_mat; } /************************************************************** *矩阵与矩阵相减 A - B is $A->minus($B) 注意前提条 ****************************************************************/ function minus($some_mat) { $substract = new ism_mat(array(), $this->element,$this->element_name); if($this->size_eq($some_mat)) { for($i = 0; $i <$this->get_num_rows(); $i++) { for($j = 0; $j <$this->get_num_columns(); $j++) { if(empty($this->array_number[$i][$j]) == false) { if(empty($some_mat->array_number[$i][$j]) == false) { $substract->array_number[$i][$j] = $this->array_number[$i][$j] - $some_mat->array_number[$i][$j]; if ($substract->array_number[$i][$j] >1) { $substract->array_number[$i][$j]=1; } if ($substract->array_number[$i][$j] <0) { $substract->array_number[$i][$j]=0; } } else { $substract->array_number[$i][$j] = $this->array_number[$i][$j]; if ($substract->array_number[$i][$j] >1) { $substract->array_number[$i][$j]=1; } if ($substract->array_number[$i][$j] <0) { $substract->array_number[$i][$j]=0; } } } else { if(empty($some_mat->array_number[$i][$j]) == false) { $substract->array_number[$i][$j] = -1*$some_mat->array_number[$i][$j]; if ($substract->array_number[$i][$j] >1) { $substract->array_number[$i][$j]=1; } if ($substract->array_number[$i][$j] <0) { $substract->array_number[$i][$j]=0; } } } } } } else { echo "\n\n\n 维度不同,矩阵无法相减 \n\n\n"; } return $substract; } /********************************************************************* * 布尔矩阵相加 A + B 对应的函数是 $A->plus($B) 注意两个的大小要相 **********************************************************************/ function plus($some_mat) { $add = new ism_mat($this->array_number, $this->get_num_rows(),$this->element_name); if($this->size_eq($some_mat)) { $some_mat = $some_mat->s_times(-1); $add = $this->minus($some_mat); } else { echo "\n\n\n 大小不同,或者其它错误 \n\n\n"; } return $add; } /********************************************************************* * 获得骨架矩阵 S * 对于可达矩阵(缩减矩阵) R I表示单位矩阵 * S=R-(R-I)(R-I) **********************************************************************/ function s_mat() { $R=$this->r_mat(); $I=$R->i(); $tmp=$R->minus($I); $tmp2=$tmp->muti($tmp); $s_mat=$R->minus($tmp2); return $s_mat; } /********************************************************** * 获得行的 ***********************************************************/ function get_num_rows() { return $this->numRows; } /********************************************************** * 获得列的 ***********************************************************/ function get_num_columns() { return $this->numColumns; } /****************************************************************** * 显示矩阵内容以0 1的方式显示 * ********************************************************************/ function echo_mat() { $numb = $this->array_number; echo &#39;&#39;."\n"; echo &#39;&#39;; for($i=0;$i<$this->element;$i++) { echo &#39;&#39;; } echo &#39;&#39;."\r\n"; for($i = 0; $i <$this->get_num_rows();$i++) { //echo &#39;&#39;; echo &#39;&#39;; for($j = 0; $j <$this->get_num_columns(); $j++) { if(empty($numb[$i][$j]) == false) { echo ""; } else { echo ""; } } echo "\n"; } echo "
&#39;.$this->element_name[$i].&#39;
&#39;.$this->element_name[$i].&#39;".$numb[$i][$j]."  
\n"; } /****************************************************************** * 显示矩阵内容 以 要素的名称方式显示兼容非方阵的显示 * ********************************************************************/ function echo_e() { $numb = $this->array_number; echo &#39;&#39;."\n"; for($i = 0; $i <$this->get_num_rows();$i++) { if(empty($numb[$i])==false) { echo &#39;\n"; } } echo "
&#39;.$this->element_name[$i].&#39;&#39;; for($j = 0; $j <$this->get_num_columns(); $j++) { if(empty($numb[$i][$j]) == false) { echo "".$this->element_name[$j]."、"; } else { echo ""; } } echo "
\n"; } /****************************************************************** * 用图形方式显示 * 返回的是 一列 ||(6:g)- (>[1,5,7,11]) () 这 ********************************************************************/ function show_graphy() { $numb = $this->array_number; for($i = 0; $i <$this->element;$i++) { echo "(".$i.&#39;:&#39;.$this->element_name[$i].")"; if(empty($numb[$i]) == false) { $x=1;//判断一行中可达数目的标尺 echo &#39;- (>[&#39;; for($j=0;$j<$this->element;$j++) { if( empty($this->array_number[$i][$j])==false and count($numb[$i])>$x) { echo $j; echo&#39;,&#39;; $x++; } elseif( empty($this->array_number[$i][$j])==false and count($numb[$i])==$x) { echo $j; } } echo &#39;]) &#39;; } echo &#39;()&#39;; echo "\r\n"; echo "||"; } } /****************************************************************** * 用图形方式显示 * 返回的是 一列 ||(6:g)- (>[1,5,7,11]) 这 ********************************************************************/ function show_rand_pos_graphy() { $numb = $this->array_number; for($i = 0; $i <$this->element;$i++) { $null_num=mt_rand(0,5); for($n=0;$n<$null_num;$n++) { echo "()"; } if(empty($numb[$i]) == false) { $x=1;//判断一行中可达数目的标尺 echo "(".$i.&#39;:&#39;.$this->element_name[$i].""; echo &#39;>[&#39;; for($j=0;$j<$this->element;$j++) { if( empty($this->array_number[$i][$j])==false and count($numb[$i])>$x) { echo $j; echo&#39;,&#39;; $x++; } elseif( empty($this->array_number[$i][$j])==false and count($numb[$i])==$x) { echo $j; } } echo &#39;]) &#39;; } else { echo "(".$i.&#39;:&#39;.$this->element_name[$i].")"; } echo &#39;()&#39;; echo "\r\n"; echo "||"; } } } ?>

推荐阅读
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了《中秋夜作》的翻译及原文赏析,以及诗人当代钱钟书的背景和特点。通过对诗歌的解读,揭示了其中蕴含的情感和意境。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 无线认证设置故障排除方法及注意事项
    本文介绍了解决无线认证设置故障的方法和注意事项,包括检查无线路由器工作状态、关闭手机休眠状态下的网络设置、重启路由器、更改认证类型、恢复出厂设置和手机网络设置等。通过这些方法,可以解决无线认证设置可能出现的问题,确保无线网络正常连接和上网。同时,还提供了一些注意事项,以便用户在进行无线认证设置时能够正确操作。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
author-avatar
呵呵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有