如何使用sagemath中的if和for循环定义矩阵?

时间:2016-05-13 19:07:16

标签: r sage

我正在使用sagemath进行计算。

现在,从R我有代码从以下代码生成大小$ 2r \次2r $的矩阵..

n=10
k=10
r=5
x=matrix(data=NA, nrow=n, ncol=k)

for(j in 1:k){
    for(i in 1:n){
    if (i==j){x[i,j]=0}
    if ((i<=r)&(i<j)&(j<=r)) {x[i,j]=2}
    if ((i<=r)&(i>j)&(j<=r)) {x[i,j]=2}      
    if ((i<=r)&(j>r)){x[i,j]=1}    
    if ((i>r)&(j<=r)) {x[i,j]=1}
    if ((i>r)&(j>r)){x[i,j]=0}
    if ((i>r)& (i<j) &(j>r)){x[i,j]=2} 
    if ((i>r)& (i>j) &(j>r)){x[i,j]=2}
      }
  }
x

我怎样才能在SageMath中做同样的事情?

1 个答案:

答案 0 :(得分:2)

constructing a matrix in Sagemath时,您可以传入一个计算其条目的函数,这样就不需要显式(通常效率低下)循环。此函数在下面定义为xentries:我使用了与帖子中相同的条件,但将其分组以便于阅读。

def xentries(i, j, r):
    if i == j or (i > r and j > r):
        return 0
    if (i <= r and j > r) or (i > r and j <= r):
        return 1
    return 2
n = 10
k = 10
r = 5
x = matrix(ZZ, n, k, lambda i, j: xentries(i, j, r))

这里,ZZ表示整数,用于表示矩阵具有整数条目。它可能是理性的QQ或真正的RR。其他参数是矩阵的大小,以及构造其条目的函数。矩阵x现在如下:

[0 2 2 2 2 2 1 1 1 1]
[2 0 2 2 2 2 1 1 1 1]
[2 2 0 2 2 2 1 1 1 1]
[2 2 2 0 2 2 1 1 1 1]
[2 2 2 2 0 2 1 1 1 1]
[2 2 2 2 2 0 1 1 1 1]
[1 1 1 1 1 1 0 0 0 0]
[1 1 1 1 1 1 0 0 0 0]
[1 1 1 1 1 1 0 0 0 0]
[1 1 1 1 1 1 0 0 0 0]