Codeigniter:如何从db中乘以矩阵数组数据?

时间:2016-11-02 04:19:34

标签: php arrays codeigniter matrix-multiplication

我有一个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)。 结果矩阵必须乘以自身,使用下图中的模式: enter image description here

之前我做过一些研究,但没有一个是正确的。

我在模型中使用以下代码来创建算法:

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。

我想让这段代码看起来像这样:

img

请帮助我:&#39;(

2 个答案:

答案 0 :(得分:0)

sqrt()函数用于计算平方根。如果要循环播放数组中的所有元素,请删除sqrt()调用。

在PHP中,数组通常是从零开始的索引,因此您需要替换$i=1$j=1从for循环中的0开始。

请参阅Matrix multiplication

Matrix multiplication

答案 1 :(得分:0)

更新的答案: 将 $ data 数组转换为矩阵的方法:

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    var response = {
    "total_rows": 2,
    "offset": 0,
    "rows": [
        {
            "id": "5",
            "key": "5",
            "value": {
                "rev": "1-b26014051b18bce04ae2190d9cb92d81"
            },
            "doc": {
                "_id": "5",
                "_rev": "1-b26014051b18bce04ae2190d9cb92d81",
                "dataid": "5",
                "dataname": "Robin",
                "dataquote": "Blah"
            }
        },
        {
            "id": "9",
            "key": "9",
            "value": {
                "rev": "1-8ecbf37d0ccc129530e57747b46faa8e"
            },
            "doc": {
                "_id": "9",
                "_rev": "1-8ecbf37d0ccc129530e57747b46faa8e",
                "dataid": "9",
                "dataname": "Bert",
                "dataquote": "Hallo"
            }
        }
    ]
};

$scope.persons = response.rows;
}

关于矩阵乘法,我找到了这篇有趣的帖子:http://sickel.net/blogg/?p=907 使用那里找到的确切函数:

<html>
  <head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    </head>
  <body ng-app="myApp">
<div ng-controller="MyCtrl">
    <p class="lead">Persons</p>
    <ul>
        <li ng-repeat="p in persons"><a ng-href="#/quotes/{{ p.doc.dataid }}">{{ p.doc.dataname }}</a></li>
    </ul>
</div>
    </body>
  </html>

结果非常接近所需的模式:

$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++;}
}

略有差异来自舍入方法。如果这是一个问题,请参阅round()功能。