圣人中矩阵元素的条件定义

时间:2016-08-09 10:43:08

标签: python sage

在Sage中,尝试通过以下方式定义具有细胞条件的矩阵:

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)])

我收到语法错误:

...
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

这是什么问题?如何解决?

2 个答案:

答案 0 :(得分:2)

你的问题是Python问题,真的,不是Sage本身。 Python对列表推导有一些过滤,但它看起来不像这样。参见例如this question

所以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)])

顺便问一下,你真的想要if gcd(i,j)==1吗?不太可能你会在这个中得到零的gcd!

答案 1 :(得分:1)

这是另一种可能性。

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]

这使用不同的矩阵初始化语法,我们在其中 首先指定基环,矩阵大小,然后指定一个函数 (i, j)的系数。请注意,因为Sage索引行和 来自0的列,我们必须将我们的功能应用于i + 1j + 1

-1放入非互助(i, j)可能比-1.0效果更好 用于精确计算。