2011-10-29 10 views
5

Intentaré explicar el problema que tengo con este código.Automatizar suma en la matriz

Este script funciona bien hasta para tres personas ($ 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 

Pero si tengo sólo cuatro personas ($ numRows = 4), necesito algo como esto:

$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 

Así que el problema es automatizar estos cambios en la relación de $ numRows.

Aquí es una demostración de álgebra matricial:

Enter image description here

Lo único que quiero es poner mi código de forma dinámica en función del número de personas.

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

Lo que puede ser diferente en mi caso es solo el número de personas.

Más información here.

+0

su pregunta es totalmente claro. por favor escriba su pregunta – diEcho

+0

Por favor, describa el problema en términos más generales, tratando de averiguar qué es lo que quiere hacer de un código demasiado complicado no es fácil. ¿Cuál es tu estructura de datos? ¿Tiene varias variables '$ contaH0',' $ contaH1', etc.? ¿Por qué no estás usando matrices? – deceze

+0

no hay problema con el código anterior. Lo único que quiero implementar es una cantidad variable de filas de suma. si el número de $ numRows es 3, entonces debe tener tres sumas para cada ciclo, si 4, debe tener cuatro sumas, si es 5, debe tener 5 sumas. Lo que debe cambiar es el número de sumas en función de $ numRows – Daniel

Respuesta

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

esto es exactamente lo que necesito. Gracias – Daniel

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

gracias de nuevo. la salida será '([0] => 313.76656746 [1] => 0 [2] => 0 [3] => 0) [1] => 0)'.Y el correcto debería ser algo como esto: '([0] => 0.320670055732 [1] => 0.324886219083 [2] => 0.19494002706 [3] => 0.159503698125)' gracias por el esfuerzo – Daniel

0

que podría estar interesado en la biblioteca Math_Matrix que le ayudará a hacer todo tipo de aritmética matriz.

El código siguiente, sin embargo, automatiza su solución:

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

Además, para empatar el partido más en su estructura de matriz existente:

$matrix = array(); 
for ($z = 0; $z < $numRows; $z++) { 
    $matrix[] = ${'contaH'.$z}; 
} 
Cuestiones relacionadas