2016-05-13 36 views
0

私は自分の計算にsagemathを使用しています。sagemathのifとforループを使って行列を定義する方法は?

さて、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で同じことを行うことができますを生成するためのコードはありますか?

答えて

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] 
+0

...そのラムダはなぜ使用されますか? – gloom

+1

Pythonにはラムダ関数と呼ばれるものがあり、これは[多くの場所で](http://www.secnetix.de/olli/Python/lambda_functions.hawk)で記述されています。 –

+0

ありがとう... @サンドイッチ – gloom

関連する問題