Автоматизировать суммирование в массиве
Я попытаюсь объяснить проблему, которая у меня возникла с этим кодом.
Этот скрипт хорошо работает для трех человек ($numRows = 3).
$z=0;
$i=0;
$x=0;
do {
$total[] = (
${'contaH'.$z}[$i+0]*$final[$x+0]+
${'contaH'.$z}[$i+1]*$final[$x+1]+
${'contaH'.$z}[$i+2]*$final[$x+2]
);
$z++;
} while ($z<$numRows); //3
Но если у меня всего четыре человека ($numRows = 4), мне нужно что-то вроде этого:
$z=0;
$i=0;
$x=0;
do {
$total[] = (
${'contaH'.$z}[$i+0]*$final[$x+0]+
${'contaH'.$z}[$i+1]*$final[$x+1]+
${'contaH'.$z}[$i+2]*$final[$x+2]+
${'contaH'.$z}[$i+3]*$final[$x+3]
// if they are 5 persons ($numRows=5), here, should exists another row
);
$z++;
} while ($z<$numRows); //4
Таким образом, проблема состоит в том, чтобы автоматизировать эти изменения в отношении $numRows.
Вот демонстрация матричной алгебры:
Единственное, что я хочу, это динамически поместить свой код в функцию числа лиц.
A | B | C | D
Person1
Person2
Person3
Person4
...
Что может отличаться в моем случае, так это просто количество людей.
Более подробная информация здесь.
3 answers
$z=0;
$i=0;
$x=0;
$numRows = 5;
do{
$currentSum = 0;
for($c = 0; $c < $numRows; $c++){
$currentSum += (${'contaH'.$z}[$i+$c] * $final[$x+$c]);
}
$total[] = $currentSum;
$z++;
}while($z < $numRows);
$subtotal = 0;
for ($i = 0; $i < $numRows; $i++) {
$subtotal += ${'contaH'.$z}[$i] * $final[$i];
}
$total[] = $subtotal;
Вас может заинтересовать библиотека Math_Matrix, которая поможет вам выполнять все виды матричной арифметики.
Однако следующий код автоматизирует ваше решение:
function mat_mult($matrix, $vector) {
$result = array();
$matrixWidth = count($matrix[0]);
for ($z = 0; $z < $matrixWidth; $z++) {
$value = 0;
for ($y = 0; $y < $matrixWidth; $y++) {
$value += $matrix[$z][$y]*$vector[$y];
}
$result[] = $value;
}
return $result;
}
$matrix = array(
array(1, 1/3.0, 2, 4),
array(3, 1, 5, 3),
array(1/2.0, 1/5.0, 1, 1/3.0),
array(1/4.0, 1/3.0, 3, 1)
);
$vector = array(0.26, 0.50, 0.09, 0.16);
$v2 = mat_mult($matrix, $vector);
print_r($v2);
Кроме того, чтобы больше привязать его к существующей структуре матрицы:
$matrix = array();
for ($z = 0; $z < $numRows; $z++) {
$matrix[] = ${'contaH'.$z};
}