2016-08-09 10 views
1

Ich mag eine Matrix mit den Bedingungen für die Zellen in Sage definieren:Conditional Definition der Matrixelemente in Salbei

matrix([[(if gcd(i,j)==0: log(radical((i+j)*i*j)) else: -1.0) for j in srange(1,5)] for i in srange(1,5)]) 

I einen Fehler:

...

matrix([[(if gcd(i,j)==_sage_const_0 : log(radical((i+j)*i*j)) else: -_sage_const_1p0) for j in srange(_sage_const_1 ,_sage_const_5)] for i in srange(_sage_const_1 ,_sage_const_5)]) 
     ^
SyntaxError: invalid syntax  

Was ist das Problem hier? Wie behebt man das?

Antwort

1

Hier ist eine andere Möglichkeit.

sage: f = lambda i, j: log(radical((i + j)*i*j)) if gcd(i,j) == 1 else -1 
sage: m = matrix(SR, 4, lambda i, j: f(i + 1, j + 1)) 
sage: m 
[ log(2) log(6) log(6) log(10)] 
[ log(6)  -1 log(30)  -1] 
[ log(6) log(30)  -1 log(42)] 
[log(10)  -1 log(42)  -1] 

Dies verwendet eine andere Syntax für Matrix-Initialisierung, in der wir ersten Basisring spezifizieren, die Matrixgröße, und dann eine Funktion von (i, j) für Koeffizienten. Beachten Sie, dass, da Sage Zeilen und Spalten von 0 indiziert, wir unsere Funktion auf i + 1 und j + 1 anwenden müssen.

Putting -1 für Nicht-coprime (i, j) könnte besser funktionieren als -1.0 für genaue Berechnungen.

2

Ihr Problem ist ein Python, wirklich, nicht Sage per se. Python hat einige Filter für Listen-Comprehensions, aber es sieht nicht so aus. Siehe z.B. this question.

So let's try it:

matrix([[log(radical((i+j)*i*j)) if gcd(i,j)==0 else -1.0 for j in srange(1,5)] for i in srange(1,5)]) 

By the way, haben Sie wirklich wollen, if gcd(i,j)==1? Unwahrscheinlich erhalten Sie einen gcd von Null in diesem!

+0

Seltsam, ich habe so viele Varianten getestet (ich bin neu bei Py und Salbei), natürlich funktioniert es. Und ja, es sollte == 1 sein. Vielen Dank! –

+1

Gern geschehen - und froh, dass Sie tatsächlich Kopralität wollten! – kcrisman