Codeigniter:如何乘以数据库中的矩阵数组数据?
Codeigniter : how to multiply matrices array data from db?
好吧,我对 php 中的矩阵乘法逻辑有疑问;数据以一维数组 (Array ( [0] => 1.0000 [1] => 0.5000 [2] => 3.0000 [3] => 2.0000 [4] => 1.0000 [5] => 5.0000 [6] => 0.3333 [7] => 0.2000 [8] => 1.0000 )
) 的形式来自数据库,我需要将其转换为矩阵。原始数组的维度是一个平方数(在本例中为 9),因此结果矩阵将具有两个相等的维度,均等于原始数据数组的平方根 (3)。
结果矩阵必须自相乘,使用下图中的模式:
我之前做过一些研究,但是 none 是对的。
我在模型中使用了以下代码来创建算法:
function hitung_matriks(){
$query = $this->db->query("select * from banding b
inner join kriteria a on a.Kd_Kriteria1 = b.Kd_Kriteria1");
$dt_matriks = $query->result();
$data = array();
foreach($dt_matriks as $a){
$data[] = $a->Nilai_Banding;
}
echo "<pre>";
print_r($data);
echo "</pre>";
$c = array();
for($i=1;$i<=sqrt(count($data));$i++){
$d = array();
$isi=0;
for($j=1;$j<=sqrt(count($data));$j++){
$isi = $data[$i][$j] * $data[$j][$i];
$d[] = $isi;
}
$c[] = $d;
}
echo "<pre>";
print_r($c);
echo "</pre>";die();
}
每个数组的结果都是0。
我想让这段代码像这样工作:
请帮助我:'(
sqrt()函数用于计算平方根。如果要循环数组中的所有元素,请删除 sqrt()
调用。
在PHP中,数组通常是从零开始的索引,所以你需要将$i=1
、$j=1
替换为在你的for循环中从0开始。
更新后的答案:
$data数组转矩阵的方法:
$data = array(1.0000, 0.5000, 3.0000, 2.0000, 1.0000, 5.0000, 0.3333, 0.2000, 1.0000);
$data2 = array();
$j = 0;
$k = 0;
for($i=0;$i<count($data);$i++){
if($j < sqrt(count($data)) ){
$data2[$j][$k] = $data[$i];
$j++;
}else{$j = 0; $k++;}
}
关于矩阵乘法,我发现这个很有趣post:http://sickel.net/blogg/?p=907
使用在那里找到的确切函数:
function matrixmult($m1,$m2){
$r=count($m1);
$c=count($m2[0]);
$p=count($m2);
if(count($m1[0])!=$p){throw new Exception('Incompatible matrixes');}
$m3=array();
for ($i=0;$i< $r;$i++){
for($j=0;$j<$c;$j++){
$m3[$i][$j]=0;
for($k=0;$k<$p;$k++){
$m3[$i][$j]+=$m1[$i][$k]*$m2[$k][$j];
}
}
}
return($m3);
}
$c = matrixmult($data2, $data2);
foreach($c as $k => $v){
$i = 0;
foreach($v as $kk => $vv){
echo $vv . ' | ';
$i++;
if($i == count($v))
echo '<br/>';
}
}
结果非常接近所需的模式:
2.9999 | 1.6 | 8.5 |
5.6665 | 3 | 16 |
1.0666 | 0.56665 | 2.9999 |
细微的差别来自四舍五入的方法。如果这是一个问题,请参阅 round() 函数。
好吧,我对 php 中的矩阵乘法逻辑有疑问;数据以一维数组 (Array ( [0] => 1.0000 [1] => 0.5000 [2] => 3.0000 [3] => 2.0000 [4] => 1.0000 [5] => 5.0000 [6] => 0.3333 [7] => 0.2000 [8] => 1.0000 )
) 的形式来自数据库,我需要将其转换为矩阵。原始数组的维度是一个平方数(在本例中为 9),因此结果矩阵将具有两个相等的维度,均等于原始数据数组的平方根 (3)。
结果矩阵必须自相乘,使用下图中的模式:
我之前做过一些研究,但是 none 是对的。
我在模型中使用了以下代码来创建算法:
function hitung_matriks(){
$query = $this->db->query("select * from banding b
inner join kriteria a on a.Kd_Kriteria1 = b.Kd_Kriteria1");
$dt_matriks = $query->result();
$data = array();
foreach($dt_matriks as $a){
$data[] = $a->Nilai_Banding;
}
echo "<pre>";
print_r($data);
echo "</pre>";
$c = array();
for($i=1;$i<=sqrt(count($data));$i++){
$d = array();
$isi=0;
for($j=1;$j<=sqrt(count($data));$j++){
$isi = $data[$i][$j] * $data[$j][$i];
$d[] = $isi;
}
$c[] = $d;
}
echo "<pre>";
print_r($c);
echo "</pre>";die();
}
每个数组的结果都是0。
我想让这段代码像这样工作:
请帮助我:'(
sqrt()函数用于计算平方根。如果要循环数组中的所有元素,请删除 sqrt()
调用。
在PHP中,数组通常是从零开始的索引,所以你需要将$i=1
、$j=1
替换为在你的for循环中从0开始。
更新后的答案: $data数组转矩阵的方法:
$data = array(1.0000, 0.5000, 3.0000, 2.0000, 1.0000, 5.0000, 0.3333, 0.2000, 1.0000);
$data2 = array();
$j = 0;
$k = 0;
for($i=0;$i<count($data);$i++){
if($j < sqrt(count($data)) ){
$data2[$j][$k] = $data[$i];
$j++;
}else{$j = 0; $k++;}
}
关于矩阵乘法,我发现这个很有趣post:http://sickel.net/blogg/?p=907 使用在那里找到的确切函数:
function matrixmult($m1,$m2){
$r=count($m1);
$c=count($m2[0]);
$p=count($m2);
if(count($m1[0])!=$p){throw new Exception('Incompatible matrixes');}
$m3=array();
for ($i=0;$i< $r;$i++){
for($j=0;$j<$c;$j++){
$m3[$i][$j]=0;
for($k=0;$k<$p;$k++){
$m3[$i][$j]+=$m1[$i][$k]*$m2[$k][$j];
}
}
}
return($m3);
}
$c = matrixmult($data2, $data2);
foreach($c as $k => $v){
$i = 0;
foreach($v as $kk => $vv){
echo $vv . ' | ';
$i++;
if($i == count($v))
echo '<br/>';
}
}
结果非常接近所需的模式:
2.9999 | 1.6 | 8.5 |
5.6665 | 3 | 16 |
1.0666 | 0.56665 | 2.9999 |
细微的差别来自四舍五入的方法。如果这是一个问题,请参阅 round() 函数。