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

问题描述 投票:1回答:2

在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
2个回答
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更精确地计算。


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!

© www.soinside.com 2019 - 2024. All rights reserved.