自动计算数组中的总和

5
我将尝试解释我在这段代码中遇到的问题。
这个脚本在最多三个人时运行良好($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有关。

这里是矩阵代数的演示:

Enter image description here

我想要的唯一一件事是将我的代码动态地放入一个人数函数中。

A   |  B |  C |  D
Person1
Person2
Person3
Person4
...

在我的情况下可能不同的只是人数。更多信息请在这里查看。

请用更一般的术语描述问题,从一个过于复杂的代码片段中理解你想要做什么并不容易。你的数据结构是什么?你是否有多个变量$contaH0$contaH1等等?为什么不使用数组呢? - deceze
2
$total[] = () 应该有可变数量的求和。 $total[] = (1), $total[] = (1+1), $total[] = (1+1+1), $total[] = (1+1+1+1), $total[] = (1+1+1+1+1)。求和的数量随着 $numRows 的函数而改变。我不能更清楚了 :S - Daniel
这不是我的问题--你想实现什么?如果只使用“3”就可以正常工作,为什么要使用total[2] = 1 + 1 + 1?如果您想对该数组中的所有值求和,那么为什么不使用数学方法呢? ($ sum = $ n *($ n +1)/ 2) - Leonardo Herrera
@LeonardoHerrera,有关矩阵代数的更多细节请参见我的问题。 - Daniel
更近了。建议:这个问题应该被问为“我如何在Perl中使用多维数组进行矩阵计算?”这样一切都会容易得多。我会尝试回答你的问题。 - Leonardo Herrera
显示剩余4条评论
3个回答

2
$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);

0
$subtotal = 0;
for ($i = 0; $i < $numRows; $i++) {
   $subtotal += ${'contaH'.$z}[$i] * $final[$i];
}
$total[] = $subtotal;

感谢您的努力。输出应该是这样的:([0] => 0.320670055732 [1] => 0.324886219083 [2] => 0.19494002706 [3] => 0.159503698125)而不是这样的:([0] => 313.76656746 [1] => 0 [2] => 0 [3] => 0) - Daniel

0

你可能会对 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};
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接