Как суммировать взвешенные массивы в PHP? - PullRequest
1 голос
/ 24 октября 2008

Как мне умножить значения многомерного массива на весовые коэффициенты и суммировать результаты в новый массив на PHP или вообще?

Скучный путь выглядит так:

$weights = array(0.25, 0.4, 0.2, 0.15);
$values  = array
           ( 
             array(5,10,15), 
             array(20,25,30), 
             array(35,40,45), 
             array(50,55,60)
           );
$result  = array();

for($i = 0; $i < count($values[0]); ++$i) {
  $result[$i] = 0;
  foreach($weights as $index => $thisWeight)
    $result[$i] += $thisWeight * $values[$index][$i];
}

Есть ли более элегантное решение?

Ответы [ 3 ]

1 голос
/ 24 октября 2008

Зависит от того, что вы подразумеваете под элегантностью, конечно.

function weigh(&$vals, $key, $weights) {
    $sum = 0;
    foreach($vals as $v)
        $sum += $v*$weights[$key];
    $vals = $sum;
}

$result = $values;
array_walk($result, "weigh", $weights);

РЕДАКТИРОВАТЬ: Извините, что не читал ваш пример лучше. Я делаю в результате копию значений, так как array_walk работает по ссылке.

0 голосов
/ 24 октября 2008

Сначала я также неправильно понял вопрос.

Полагаю, что при таком представлении данных любой другой выбор будет менее понятным, чем у вас.

Если бы мы могли изменить его на что-то другое, например, если бы мы транспонировали матрицу и умножили ее наоборот, тогда было бы очень легко получить более лаконичный и, вероятно, элегантный способ.

<?php

$weights = array(0.2,0.3,0.4,0.5);
$values = array(array(1,2,0.5), array(1,1,1), array(1,1,1), array(1,1,1));
$result = array();

for($i = 0; $i < count($values[0]); ++$i) {
        $result[$i] = 0;
        foreach($weights as $index => $thisWeight) {
           $result[$i] += $thisWeight * $values[$index][$i];
        }
}
print_r($result);


$result = call_user_func_array("array_map",array_merge(array("weightedSum"),$values));

function weightedSum() {
    global $weights;
    $args = func_get_args();
    return array_sum(array_map("weight",$weights,$args));
}

function weight($w,$a) {
    return $w*$a;
}

print_r($result);

?>
0 голосов
/ 24 октября 2008

Хм ...

foreach($values as $index => $ary )
  $result[$index] = array_sum($ary) * $weights[$index];
...