2017-04-01 5 views
0

図の行列を埋める必要があります。私の方法は東にはないループを使うことです。ディメンションが大きい場合は効率的ではありません。 (?ベクトル化や、私が知らないいくつかの機能を使用して言う) は、簡単に読んで、おそらくより速くできるようにする任意の方法は、ここで対角ベクトルの右に3つの要素を塗りつぶすより直感的な方法

enter image description here

# The code is in python, but I am open to R as well.  
    S=6 
    p=[0.1,0.3,0.6] # the pi in the figure 
    # The reason I use loop for p is that it handles a flexible dimension of p 
    mat = np.zeros((S, S)) 
    p = np.array(p) 
    for i in range(S): 
     for j, x in enumerate(p): 
       if i + j < S-1: 
        mat[i+j][i] = x 

       elif i + j == S-1: 
        mat[S-1][i] = p[j:].sum() 
       else: 
        pass 

    mat.T 
+1

を与える[この](http://stackoverflow.com/questions/5852495/how-do-i-find-the:いくつかはscipy.sparse.diagsを使用してさらに別の方法を、明らかにしたグーグル-scalar-product-of-a-numpy-matrix)が役に立ちます。また、 'for'を使うと、' for'の後の黄色部分の値を変更します。 'for'の中で' if'を使う必要はありません。これは2回の変更だけで面倒です。 –

答えて

1

いつもと同じように、マトリックスを構築する方法はたくさんあります。最初にそれを見たとき、私は「ああ、それはトプリッツの頂点のようだ」と思ったが、pの対角線を合計することも有効なはずである(右下の変更を含む)。

import numpy as np 
import scipy.sparse 
from scipy.linalg import triu, toeplitz 

def build_toep(S, p): 
    out = triu(toeplitz(p + [0]*(S-len(p)))) 
    out[-2:,-1] = [1 - p[1], 1] 
    return out 

def build_diag(S, p): 
    out = sum(np.diag([v]*(S-i), i) for i,v in enumerate(p)) 
    out[-2:,-1] = [1 - p[1], 1] 
    return out 

def build_sparse(S, p): 
    out = scipy.sparse.diags(p, range(len(p)), shape=(S, S)).toarray() 
    out[-2:,-1] = [1 - p[1], 1] 
    return out 

In [150]: S, p = 6, [0.1, 0.3, 0.6] 

In [151]: build_toep(S, p) 
Out[151]: 
array([[ 0.1, 0.3, 0.6, 0. , 0. , 0. ], 
     [ 0. , 0.1, 0.3, 0.6, 0. , 0. ], 
     [ 0. , 0. , 0.1, 0.3, 0.6, 0. ], 
     [ 0. , 0. , 0. , 0.1, 0.3, 0.6], 
     [ 0. , 0. , 0. , 0. , 0.1, 0.7], 
     [ 0. , 0. , 0. , 0. , 0. , 1. ]]) 

In [152]: np.allclose(build_toep(S, p), build_diag(S, p)) 
Out[152]: True 

In [153]: np.allclose(build_toep(S, p), build_sparse(S, p)) 
Out[153]: True 
+0

これはテプリッツの一部です(これまで聞いたことはありません)、ありがとうございました。 – alphabetagamma

1

あります例です - 値であなたを埋めます

mat <- matrix(0,nrow=10,ncol=10) 
diag(mat) <- 1 
diag(mat[1:(ncol(mat)-1),-1]) <- 2 
diag(mat[1:(ncol(mat)-2),-(1:2)]) <- 3 

mat 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 1 2 3 0 0 0 0 0 0  0 
[2,] 0 1 2 3 0 0 0 0 0  0 
[3,] 0 0 1 2 3 0 0 0 0  0 
[4,] 0 0 0 1 2 3 0 0 0  0 
[5,] 0 0 0 0 1 2 3 0 0  0 
[6,] 0 0 0 0 0 1 2 3 0  0 
[7,] 0 0 0 0 0 0 1 2 3  0 
[8,] 0 0 0 0 0 0 0 1 2  3 
[9,] 0 0 0 0 0 0 0 0 1  2 
[10,] 0 0 0 0 0 0 0 0 0  1 
+0

おかげさまで、それを3つの対角線に分解するのは賢明です。 – alphabetagamma