<?php
/**
* descr: Fuehrt einige einfache Matrix-Operationen durch
*/

$R_html '';
$fehler '';
$verknuepfungen = array('add'=>'+''sub'=>'-''mul'=>'*''kreuz'=>'x''dyadisch'=>'o');

if (!empty(
$_REQUEST['A'])) {
    
$A matrix($_REQUEST['A']);
    if (!
is_array($A)) {$fehler $A;}
    
$B matrix($_REQUEST['B']);
    if (!
is_array($B)) {$fehler $B;}
    
$v "v_$_REQUEST[verknuepfung]";
    if (!
$fehler) {
        
$R $v($A$B);
        if (!
is_array($R)) {
            
$fehler $R;
        } else {
            
$R_html matrix_html($R);
        }
    }
} else {
    
$_REQUEST['A'] = '';
    
$_REQUEST['B'] = '';
    
$_REQUEST['verkuepfung'] = 'multiplikation';
}

ausgabe($fehler$R_html$verknuepfungen);

function 
matrix($str) {
    
$str preg_replace('/ +/'' 'trim($str));
    
$A = array();
    
$n 0;
    
$zeilen explode("\n"$str);
    foreach (
$zeilen as $i=>$z) {
        
$spalten explode(" "$z);
        foreach (
$spalten as $j=>$s) {
            
$A[$i][$j] = $s;
        }
        if (!
$n$n $j;
        else if (
$n != $j) return "keine Matrix";
    }
    return 
$A;
}

function 
v_add($A$B) {
    
$R = array();
    foreach (
$A as $i=>$z) {
        foreach (
$z as $j=>$s) {
            if (!isset(
$B[$i][$j])) return 'Dimensionen passen nicht!';
            
$R[$i][$j] = $A[$i][$j] + $B[$i][$j];
        }
    }
    return 
$R;
}

function 
v_sub($A$B) {
    
$R = array();
    foreach (
$A as $i=>$z) {
        foreach (
$z as $j=>$s) {
            if (!isset(
$B[$i][$j])) return 'Dimensionen passen nicht!';
            
$R[$i][$j] = $A[$i][$j] - $B[$i][$j];
        }
    }
    return 
$R;
}

function 
v_mul($A$B) {
    if (
spalten($A) != zeilen($B)) return 'Dimensionen passen nicht!';
    
$R = array();
    for (
$i=0$i zeilen($A); ++$i) {
        for (
$j=0$j spalten($B); ++$j) {
            
$R[$i][$j] = 0;
            for (
$n 0$n zeilen($B); ++$n) {
                
$R[$i][$j] += $A[$i][$n] * $B[$n][$j];
            }
        }
    }
    return 
$R;
}

function 
v_dyadisch($A$B) {
    if (
spalten($A) != zeilen($B) or zeilen($A) != or spalten($B) != 1) return 'Dimensionen passen nicht!';
    
$R = array();
    for (
$i=0$i spalten($A); ++$i) {
        for (
$j=0$j zeilen($B); ++$j) {
            
$R[$i][$j] = $A[0][$i] * $B[$j][0];
        }
    }
    return 
$R;
}

function 
v_kreuz($A$B) {
    if (
spalten($A) != or zeilen($B) != or zeilen($A) != or spalten($B) != 1) return 'Dimensionen passen nicht!';
    
$R = array(
        array(
$A[0][1]*$B[2][0] - $A[0][2]*$B[1][0]),
        array(
$A[0][2]*$B[0][0] - $A[0][0]*$B[2][0]),
        array(
$A[0][0]*$B[1][0] - $A[0][1]*$B[0][0]),
    );
    return 
$R;
}

function 
matrix_html($R) {
    
$s '<table>';
    foreach (
$R as $z) {
        
$s .= '<tr>';
        foreach (
$z as $sp) {
            
$s .= "<td>$sp</td>";
        }
        
$s .= "</tr>\n";
    }
    
$s .= "</table>\n";
    return 
$s;
}

function 
zeilen($A) {
    return 
count($A);
}

function 
spalten($A) {
    if (!
count($A)) return 0;
    return 
count($A[0]);
}

function 
ausgabe($fehler$R$verknuepfungen) {
?>
<html>
<head><title>Matrizenrechnung</title></head>
<body>
<h1>Matrizenrechnung</h1>
<?php echo $fehler?>
<form action="" method="get">
<table><tr>
<td><textarea name="A" cols="10" rows="5"><?php echo $_REQUEST['A']; ?></textarea></td>
<td><select name="verknuepfung">
<?php
    
foreach ($verknuepfungen as $v=>$V) {
        
$s = ($_REQUEST['verknuepfung'] == $v) ? 'selected="selected"' '';
        echo 
"<option $s value='$v'>$V</option>\n";
    }
?>
</select></td>
<td><textarea name="B" cols="10" rows="5"><?php echo $_REQUEST['B']; ?></textarea></td>
<td><input type="submit" value="="></td><td><?php echo $R?></td>
</tr></table>

</form>
Eintrge durch Leerzeichen trennen.<br />
Fr Skalarprodukt, Kreuzprodukt und Dyadisches Produkt: Erster Vektor in Zeilendarstellung, zweiter Vektor in Spaltendarstellung.
</body>
</html>
<?php
}

?>