2017-02-04 4 views
1

Was ich wirklich interessant finde, ist Fähigkeit des Fortrans Schablonen Updates: stattAusgleichsschablonen Update in anderen Sprachen

t2 = v(1) 
do i=2, n-1 
    t1 = v(i) 
    v(i) = 0.5 * (t2 + v(i+1)) 
    t2 = t1 
enddo 

ein Looping kann ein Einzeiler verwenden, ohne eine explizite Schleife

v(2:n-1) = 0.5 * (v(1:n-2) + v(3:n)) 

(Für diese und andere Beispiele siehe this slideshow)

Ich habe nichts Ähnliches in einer anderen Programmiersprache. Gibt es eine andere Sprache, die eine ähnliche Syntax unterstützt?

+0

Was ist „es“ im ersten Satz? Die Fortran Sprache? Von Kopf bis Fuß macht MATLAB das auch. – Ross

+0

@Ross, fest, dass „es“ – marmistrz

+1

Python, Kapelle, Julia, jeder mit seiner Lieblingssprache beantworten kann. Voting zum Schließen als zu breit, weil * "Es gibt entweder zu viele mögliche Antworten" * –

Antwort

3

Es kann interessant sein, die Wiki-Seite für Array programming zu überprüfen, was sagt

Moderne Programmiersprachen, die Array-Programmierung unterstützen, werden in wissenschaftlichen und technischen Einstellungen häufig verwendet; Dazu gehören Fortran 90, Mata, MATLAB, Analytica, TK Solver (als Liste), Octave, R, Cilk Plus Julia und die NumPy Erweiterung Python ...

sowie Seiten für array slicing und a list of array languages. Also, mehrere Sprachen scheinen eine ähnliche Syntax haben

Hier einige Beispiele sind (es können Fehler sein, so überprüfen Sie bitte selbst ..) (die als ALGOL68 zurück zu so alt geht?!):

Fortran:

program main 
    implicit none 
    real, allocatable :: v(:) 
    integer i, n 

    n = 8 
    v = [(real(i)**2, i=1,n)] 
    print *, "v = ", v 

    v(2:n-1) = 0.5 * (v(1:n-2) + v(3:n)) 
    print *, "v = ", v 
end 

$ gfortran test.f90 && ./a.out 
v = 1.00000000  4.00000000  9.00000000  16.0000000  25.0000000  36.0000000  49.0000000  64.0000000  
v = 1.00000000  5.00000000  10.0000000  17.0000000  26.0000000  37.0000000  50.0000000  64.0000000 

Python:

import numpy as np 

n = 8 
v = np.array([ float(i+1)**2 for i in range(n) ]) 
print("v = ", v) 

v[1:n-1] = 0.5 * (v[0:n-2] + v[2:n]) 
print("v = ", v) 

$ python3 test.py 
v = [ 1. 4. 9. 16. 25. 36. 49. 64.] 
v = [ 1. 5. 10. 17. 26. 37. 50. 64.] 

Julia:

n = 8 
v = Float64[ i^2 for i = 1 : n ] 
println("v = ", v) 

v[2:n-1] = 0.5 * (v[1:n-2] + v[3:n]) 
println("v = ", v) 

$ julia test.jl 
v = [1.0,4.0,9.0,16.0,25.0,36.0,49.0,64.0] 
v = [1.0,5.0,10.0,17.0,26.0,37.0,50.0,64.0] 

Kapelle:

var n = 8; 
var v = (for i in 1..n do (i:real)**2); 
writeln("v = ", v); 

var vtmp = 0.5 * (v[1..n-2] + v[3..n]); 
v[2..n-1] = vtmp; 
writeln("v = ", v); 

$ chpl test.chpl && ./a.out 
v = 1.0 4.0 9.0 16.0 25.0 36.0 49.0 64.0 
v = 1.0 5.0 10.0 17.0 26.0 37.0 50.0 64.0 

(bitte Wiki-Seiten usw. für andere Sprachen sehen).

Ich denke, die Array-Notation wie : oder .. ist sehr bequem, aber es kann zu unerwarteten Ergebnissen führen (wenn nicht richtig verwendet, z. B. die Bedeutung von Indizes oder eine mögliche Überlappung von LHS/RHS) oder verursachen Overhead-Zeit (wegen der temporären Arrays), zu Fällen variieren. Also achten Sie bitte darauf, wenn es tatsächlich mit ...

Verwandte Themen