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开始。

Matrix multiplication

更新后的答案: $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() 函数。