在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
这是什么问题?如何解决?
答案 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 + 1
和j + 1
。
将-1
放入非互助(i, j)
可能比-1.0
效果更好
用于精确计算。