sage中矩阵元素的条件定义

Conditional definition of matrix elements in 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

这里有什么问题?如何解决?

你的问题是 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!

还有一种可能。

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 更有效 用于精确计算。