Como posso resumir matrizes ponderadas em PHP?
-
04-07-2019 - |
Pergunta
Como faço para multiplicar os valores de um array multi-dimensional com pesos e resumir os resultados em uma nova matriz em PHP ou em geral?
Os chato maneira esta aparência:
$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];
}
Existe uma solução mais elegante?
Solução
Depende do que você quer dizer com elegante, é claro.
function weigh(&$vals, $key, $weights) {
$sum = 0;
foreach($vals as $v)
$sum += $v*$weights[$key];
$vals = $sum;
}
$result = $values;
array_walk($result, "weigh", $weights);
EDIT: Desculpe por não ler o seu melhor exemplo. Eu faço resultar uma cópia de valores, uma vez array_walk funciona por referência.
Outras dicas
Hm ...
foreach($values as $index => $ary )
$result[$index] = array_sum($ary) * $weights[$index];
Eu também tinha entendido mal a pergunta em primeiro lugar.
Eu acho que com essa representação de dados qualquer outra escolha seria menos claro do que o que você tem.
Se pudéssemos mudá-lo para outra coisa, por exemplo, se fôssemos para transpor a matriz e multiplicar o contrário, então seria muito fácil chegar a mais sucinta e provavelmente maneira elegante.
<?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);
?>