Reduced row echelon form: Difference between revisions
Content deleted Content added
Thundergnat (talk | contribs) m →{{header|Perl 6}}: Update to more modern, idiomatic syntax |
m →{{header|REXX}}: added/changed comments and whitespace. |
||
Line 2,958: | Line 2,958: | ||
mat.2= ' 2 3 -1 -11 ' |
mat.2= ' 2 3 -1 -11 ' |
||
mat.3= ' -2 0 -3 22 ' |
mat.3= ' -2 0 -3 22 ' |
||
do r=1 until mat.r==''; _=mat.r |
do r=1 until mat.r==''; _=mat.r /*build @.row.col from (matrix) mat.X*/ |
||
do c=1 until _=''; parse var _ @.r.c _ |
|||
w=max(w, length(@.r.c) + 1) /*find the maximum width of an element.*/ |
|||
end /*c*/ |
|||
cols=max(cols,c) |
cols=max(cols, c) /*save the maximum number of columns. */ |
||
end /*r*/ |
end /*r*/ |
||
rows=r- |
rows=r - 1 /*adjust the row count (from DO loop).*/ |
||
call showMat 'original matrix' /*display the original matrix to screen*/ |
call showMat 'original matrix' /*display the original matrix to screen*/ |
||
!=1 /*set the working column pointer to 1.*/ |
!=1 /*set the working column pointer to 1.*/ |
||
/* |
/* ┌──────────────────────◄────────────────◄──── Reduced Row Echelon Form on matrix.*/ |
||
do r=1 for rows while cols>! /*begin to perform the heavy lifting. */ |
do r=1 for rows while cols>! /*begin to perform the heavy lifting. */ |
||
j=r /*use a subsitute index for the DO loop*/ |
|||
j=r |
|||
do while @.j.!==0; j=j+1 |
do while @.j.!==0; j=j + 1 |
||
if j==rows then do; j=r; !=!+1; if cols==! then leave r; end |
if j==rows then do; j=r; !=! + 1; if cols==! then leave r; end |
||
end /*while*/ |
end /*while*/ |
||
/* [↓] swap rows J,R (but not if same)*/ |
/* [↓] swap rows J,R (but not if same)*/ |
||
do _=1 for cols while j\==r; parse value @.r._ @.j._ with @.j._ @._._ |
do _=1 for cols while j\==r; parse value @.r._ @.j._ with @.j._ @._._ |
||
end /*_*/ |
|||
?=@.r.! |
?=@.r.! |
||
do d=1 for cols while ?\=1; @.r.d=@.r.d/? |
do d=1 for cols while ?\=1; @.r.d= @.r.d / ? |
||
end /*d*/ /* [↑] divide row J by @.r.p ──unless≡1*/ |
|||
do k=1 for rows; |
do k=1 for rows; ?= @.k.! /*subtract (row K) @.r.s from row K.*/ |
||
if k==r | ?=0 then iterate |
if k==r | ?=0 then iterate /*skip if row K is the same as row R.*/ |
||
do s=1 for cols; @.k.s=@.k.s - ?*@.r.s |
do s=1 for cols; @.k.s= @.k.s - ? * @.r.s |
||
end /*s*/ |
|||
end /*k*/ /* [↑] for the rest of numbers in row.*/ |
|||
!=! + 1 /*bump the column pointer. */ |
|||
end /*r*/ |
end /*r*/ |
||
Line 2,988: | Line 2,990: | ||
exit /*stick a fork in it, we're all done. */ |
exit /*stick a fork in it, we're all done. */ |
||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
showMat: parse arg title; say; say center(title, 3+(cols+1)*w, '─'); |
showMat: parse arg title; say; say center(title, 3 + (cols+1) * w, '─'); say |
||
do r=1 for rows; _= |
do r=1 for rows; _= |
||
do c=1 for cols |
do c=1 for cols |
||
if @.r.c=='' then do; say "***error*** matrix element isn't defined:" |
if @.r.c=='' then do; say "***error*** matrix element isn't defined:" |
||
say 'row' row", column" .; |
say 'row' row", column" c'.'; exit 13 |
||
end |
end |
||
_=_ right(@.r.c,w) |
_=_ right(@.r.c, w) |
||
end /*c*/ |
end /*c*/ |
||
say _ /*display a row |
say _ /*display a matrix row to the terminal.*/ |
||
end |
end /*r*/; return</lang> |
||
return</lang> |
|||
{{out|output|text= when using the default (internal) input:}} |
{{out|output|text= when using the default (internal) input:}} |
||
<pre> |
<pre> |