June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
|
|
@ -8,6 +8,7 @@ In both cases the sum is over the permutations <math>\sigma</math> of the permut
|
|||
|
||||
More efficient algorithms for the determinant are known: [[LU decomposition]], see for example [[wp:LU decomposition#Computing the determinant]]. Efficient methods for calculating the permanent are not known.
|
||||
|
||||
;Cf.:
|
||||
|
||||
;Related task:
|
||||
* [[Permutations by swapping]]
|
||||
<br><br>
|
||||
|
|
|
|||
|
|
@ -3,14 +3,14 @@ package main
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gonum/matrix/mat64"
|
||||
"gonum.org/v1/gonum/mat"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(mat64.Det(mat64.NewDense(2, 2, []float64{
|
||||
fmt.Println(mat.Det(mat.NewDense(2, 2, []float64{
|
||||
1, 2,
|
||||
3, 4})))
|
||||
fmt.Println(mat64.Det(mat64.NewDense(3, 3, []float64{
|
||||
fmt.Println(mat.Det(mat.NewDense(3, 3, []float64{
|
||||
2, 9, 4,
|
||||
7, 5, 3,
|
||||
6, 1, 8})))
|
||||
|
|
|
|||
27
Task/Matrix-arithmetic/Perl/matrix-arithmetic.pl
Normal file
27
Task/Matrix-arithmetic/Perl/matrix-arithmetic.pl
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/perl
|
||||
use strict;
|
||||
use warnings;
|
||||
use PDL;
|
||||
use PDL::NiceSlice;
|
||||
|
||||
sub permanent{
|
||||
my $mat = shift;
|
||||
my $n = shift // $mat->dim(0);
|
||||
return undef if $mat->dim(0) != $mat->dim(1);
|
||||
return $mat(0,0) if $n == 1;
|
||||
my $sum = 0;
|
||||
--$n;
|
||||
my $m = $mat(1:,1:)->copy;
|
||||
for(my $i = 0; $i <= $n; ++$i){
|
||||
$sum += $mat($i,0) * permanent($m, $n);
|
||||
last if $i == $n;
|
||||
$m($i,:) .= $mat($i,1:);
|
||||
}
|
||||
return sclr($sum);
|
||||
}
|
||||
|
||||
my $M = pdl([[2,9,4], [7,5,3], [6,1,8]]);
|
||||
print "M = $M\n";
|
||||
print "det(M) = " . $M->determinant . ".\n";
|
||||
print "det(M) = " . $M->det . ".\n";
|
||||
print "perm(M) = " . permanent($M) . ".\n";
|
||||
31
Task/Matrix-arithmetic/Sidef/matrix-arithmetic.sidef
Normal file
31
Task/Matrix-arithmetic/Sidef/matrix-arithmetic.sidef
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
class Array {
|
||||
method permanent {
|
||||
var r = @^self.len
|
||||
|
||||
var sum = 0
|
||||
r.permutations { |*a|
|
||||
var prod = 1
|
||||
[a,r].zip {|row,col| prod *= self[row][col] }
|
||||
sum += prod
|
||||
}
|
||||
|
||||
return sum
|
||||
}
|
||||
}
|
||||
|
||||
var m1 = [[1,2],[3,4]]
|
||||
|
||||
var m2 = [[1, 2, 3, 4],
|
||||
[4, 5, 6, 7],
|
||||
[7, 8, 9, 10],
|
||||
[10, 11, 12, 13]]
|
||||
|
||||
var m3 = [[0, 1, 2, 3, 4],
|
||||
[5, 6, 7, 8, 9],
|
||||
[10, 11, 12, 13, 14],
|
||||
[15, 16, 17, 18, 19],
|
||||
[20, 21, 22, 23, 24]]
|
||||
|
||||
[m1, m2, m3].each { |m|
|
||||
say "determinant:\t #{m.determinant}\npermanent:\t #{m.permanent}\n"
|
||||
}
|
||||
|
|
@ -1,24 +1,18 @@
|
|||
! MATRIX ARITHMETIC ;
|
||||
BEGIN
|
||||
|
||||
INTEGER PROCEDURE LENGTH(A); REAL ARRAY A;
|
||||
INTEGER PROCEDURE LENGTH(A); ARRAY A;
|
||||
LENGTH := UPPERBOUND(A, 1) - LOWERBOUND(A, 1) + 1;
|
||||
|
||||
PROCEDURE MINOR(A, X, Y, MAT); REAL ARRAY A, MAT; INTEGER X, Y;
|
||||
! Set MAT to the first minor of A dropping row X and column Y ;
|
||||
PROCEDURE MINOR(A, X, Y, MAT); ARRAY A, MAT; INTEGER X, Y;
|
||||
BEGIN
|
||||
INTEGER I, J, M; M := LENGTH(A) - 1;
|
||||
FOR I := 1 STEP 1 UNTIL M DO
|
||||
INTEGER I, J, rowA, M; M := LENGTH(A) - 1; ! not a constant;
|
||||
FOR I := 1 STEP 1 UNTIL M DO BEGIN
|
||||
rowA := IF I < X THEN I ELSE I + 1;
|
||||
FOR J := 1 STEP 1 UNTIL M DO
|
||||
BEGIN
|
||||
IF I < X AND J < Y THEN
|
||||
MAT(I, J) := A(I, J)
|
||||
ELSE IF I >= X AND J < Y THEN
|
||||
MAT(I, J) := A(I + 1, J)
|
||||
ELSE IF I < X AND J >= Y THEN
|
||||
MAT(I, J) := A(I, J + 1)
|
||||
ELSE ! I > X AND J > Y ;
|
||||
MAT(I, J) := A(I + 1, J + 1)
|
||||
END
|
||||
MAT(I, J) := A(rowA, IF J < Y THEN J else J + 1);
|
||||
END
|
||||
END MINOR;
|
||||
|
||||
REAL PROCEDURE DET(A); REAL ARRAY A;
|
||||
|
|
@ -68,18 +62,17 @@ BEGIN
|
|||
REAL ARRAY A(1:SIZE, 1:SIZE);
|
||||
INTEGER I, J;
|
||||
|
||||
FOR I := 1 STEP 1 UNTIL SIZE DO
|
||||
FOR I := 1 STEP 1 UNTIL SIZE DO BEGIN
|
||||
! may be need here: INIMAGE;
|
||||
FOR J := 1 STEP 1 UNTIL SIZE DO
|
||||
A(I, J) := INREAL;
|
||||
|
||||
A(I, J) := INREAL
|
||||
END;
|
||||
OUTTEXT("DETERMINANT ... : "); OUTREAL(DET (A), 10, 20); OUTIMAGE;
|
||||
OUTTEXT("PERMANENT ..... : "); OUTREAL(PERM(A), 10, 20); OUTIMAGE;
|
||||
END
|
||||
|
||||
! NOTE THAT THE FIRST INPUT IS THE SIZE OF THE MATRIX.
|
||||
! FOR EXAMPLE:
|
||||
COMMENT THE FIRST INPUT IS THE SIZE OF THE MATRIX, FOR EXAMPLE:
|
||||
|
||||
COMMENT
|
||||
! 2
|
||||
! 1 2
|
||||
! 3 4
|
||||
|
|
|
|||
28
Task/Matrix-arithmetic/Stata/matrix-arithmetic-1.stata
Normal file
28
Task/Matrix-arithmetic/Stata/matrix-arithmetic-1.stata
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
real vector range1(real scalar n, real scalar i) {
|
||||
if (i < 1 | i > n) {
|
||||
return(1::n)
|
||||
} else if (i == 1) {
|
||||
return(2::n)
|
||||
} else if (i == n) {
|
||||
return(1::n-1)
|
||||
} else {
|
||||
return(1::i-1\i+1::n)
|
||||
}
|
||||
}
|
||||
|
||||
real matrix submat(real matrix a, real scalar i, real scalar j) {
|
||||
return(a[range1(rows(a), i), range1(cols(a), j)])
|
||||
}
|
||||
|
||||
real scalar sumrec(real matrix a, real scalar x) {
|
||||
real scalar n, s, p
|
||||
n = rows(a)
|
||||
if (n==1) return(a[1,1])
|
||||
s = 0
|
||||
p = 1
|
||||
for (i=1; i<=n; i++) {
|
||||
s = s+p*a[i,1]*sumrec(submat(a, i, 1), x)
|
||||
p = p*x
|
||||
}
|
||||
return(s)
|
||||
}
|
||||
19
Task/Matrix-arithmetic/Stata/matrix-arithmetic-2.stata
Normal file
19
Task/Matrix-arithmetic/Stata/matrix-arithmetic-2.stata
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
: a=1,1,1,0\1,1,0,1\1,0,1,1\0,1,1,1
|
||||
: a
|
||||
[symmetric]
|
||||
1 2 3 4
|
||||
+-----------------+
|
||||
1 | 1 |
|
||||
2 | 1 1 |
|
||||
3 | 1 0 1 |
|
||||
4 | 0 1 1 1 |
|
||||
+-----------------+
|
||||
|
||||
: det(a)
|
||||
-3
|
||||
|
||||
: sumrec(a,-1)
|
||||
-3
|
||||
|
||||
: sumrec(a,1)
|
||||
9
|
||||
Loading…
Add table
Add a link
Reference in a new issue