簡體   English   中英

n維矩陣的遞歸

[英]recursion for n-dimensional matrix

我正在Python 3中執行一些實現,並且需要一些幫助。 我有函數,這取決於矩陣的維數。 我實際上有兩個矩陣,並希望以某種方式獲得第三個矩陣。 例如(二維矩陣):

def my_matrix_2d(mat1, mat2):
    ar = []
    for i in range(len(mat1[0])):
        ar1 = []
        for j in range(len(mat1[1])):
            try:
                ar1.append([mat1[0][i], mat1[1][j], mat2[i][j]])
            except IndexError:
                ar1.append([mat1[0][i], mat1[1][j], None])
        ar.append(ar1)
    return ar

3維矩陣的另一個示例:

def my_matrix_3d(mat1, mat2):
    ar = []
    for i in range(len(mat1[0])):
        ar1 = []
        for j in range(len(mat1[1])):
            ar2 = []
            for k in range(len(mat1[2])):
                try:
                    ar2.append([mat1[0][i], mat1[1][j], mat1[2][k], mat2[i][j][k]])
                except IndexError:
                    ar2.append([mat1[0][i], mat1[1][j], mat1[2][k], None])
            ar1.append(ar2)
        ar.append(ar1)
    return ar

我需要為n維矩陣做一個通用函數。 我知道遞歸一定要解決,但是我只是想不通。 我將不勝感激任何幫助。

編輯:

我實際上沒有很好地描述我的問題,因此我將嘗試給出詳細的描述。 首先,我將描述2D問題。 我有兩個矩陣,mat1和mat2。 len(mat1)= 2,假設len(mat1 [0])= m和len(mat1 [1])= n。 然后,mat2是mxn矩陣,因此對於i = 0,1,...,m-1,len(mat2)= m和len(mat2 [i])= n。 my_matrix_2d是函數,以某種方式組合了這兩個矩陣。 讓我們看一個具體的例子:我們可以看到mat1是2D直方圖的bin邊緣,mat2是bin的高度,因此mat1 [0]代表x坐標的bin邊緣,mat1 [1]代表y坐標的bin邊緣。 mat2表示在x坐標和y坐標邊緣相交處的倉高。 因此,my_matrix_2d在二維直方圖中存儲有關箱的邊緣和箱的高度的信息。 它的元素是向量(mat1 [0] [i],mat1 [1] [j],mat2 [i] [j]),由於我們還需要一個邊來確定垃圾箱寬度,因此最后一個向量是(mat1 [ 0] [i],mat1 [1] [j],無)。

在3D示例中類似。 mat1 [0](len = m)是x坐標的bin邊緣,mat1 [1](len = n)是y坐標的bin邊緣,mat1 [2](len = o)是z坐標的bin邊緣,而mat2是mxnxo矩陣,其中包含箱高度。 my_matrix_3d輸出應為包含元素(矩陣1 [0] [i],矩陣1 [1] [j],矩陣1 [2] [k],矩陣2 [i] [j] [k])的矩陣/數組,其中i = 0,...,m-2,j = 0,...,n-2,k = 0,...,o-2,如果i = m-1或j = n-1或k = o-1,矩陣中的元素應為(mat1 [0] [i],mat1 [1] [j],mat1 [2] [k],無)。

PS my_matrix_nd應該是n維矩陣,其形狀與mat2相同。 但是mat2中的元素是浮點數,而my_matrix_nd中的元素是len(mat1)+1個向量。

EDIT2:

我舉了具體的例子(2D):

mat1 = [
array([-82.8894492, -56.07043142, -29.25141365, -2.43239587, 24.3866219,  51.20563967,  78.02465745]),
array([-191.15188724, -103.20853717, -15.2651871, 72.67816297, 160.62151304, 248.56486311])
]

mat2 = array([[4.23988548e-08, 3.39190838e-07, 1.27196564e-07, 1.27196564e-07, 0.00000000e+00],
[1.22956679e-06, 8.35257440e-06, 1.53483854e-05, 4.45187976e-06,
1.69595419e-07],
[5.00306487e-06, 4.77835094e-05, 8.47553108e-05, 2.31073759e-05,
1.05997137e-06],
[5.13026143e-06, 5.80016334e-05, 9.37862668e-05, 2.62872900e-05,
1.01757252e-06],
[1.14476908e-06, 1.44156106e-05, 2.33617690e-05, 6.52942364e-06,
2.54393129e-07],
[0.00000000e+00, 5.93583967e-07, 1.10237023e-06, 4.23988548e-07,
4.23988548e-08]])

output:
[

[[-82.88944919513716, -191.1518872423128, 4.2398854812237576e-08], 
[-82.88944919513716, -103.20853717269506, 3.391908384979006e-07], 
[-82.88944919513716, -15.265187103077324, 1.2719656443671272e-07], 
[-82.88944919513716, 72.67816296654041, 1.2719656443671272e-07], 
[-82.88944919513716, 160.62151303615815, 0.0],
[-82.88944919513716, 248.56486310577586, None]],

[[-56.07043142169904, -191.1518872423128, 1.2295667895548898e-06], 
[-56.07043142169904, -103.20853717269506, 8.352574398010803e-06], 
[-56.07043142169904, -15.265187103077324, 1.534838544203e-05], 
[-56.07043142169904, 72.67816296654041, 4.451879755284945e-06], 
[-56.07043142169904, 160.62151303615815, 1.6959541924895036e-07], 
[-56.07043142169904, 248.56486310577586, None]],

[[-29.25141364826092, -191.1518872423128, 5.003064867844034e-06], 
[-29.25141364826092, -103.20853717269506, 4.7783509373391746e-05], 
[-29.25141364826092, -15.265187103077324, 8.475531076966292e-05], 
[-29.25141364826092, 72.67816296654041, 2.3107375872669477e-05], 
[-29.25141364826092, 160.62151303615815, 1.0599713703059398e-06], 
[-29.25141364826092, 248.56486310577586, None]],

[[-2.4323958748228023, -191.1518872423128, 5.130261432280746e-06], 
[-2.4323958748228023, -103.20853717269506, 5.8001633383141e-05], 
[-2.4323958748228023, -15.265187103077324, 9.378626684466952e-05], 
[-2.4323958748228023, 72.67816296654041, 2.628728998358729e-05], 
[-2.4323958748228023, 160.62151303615815, 1.0175725154937022e-06], 
[-2.4323958748228023, 248.56486310577586,None]],

[[24.386621898615317, -191.1518872423128, 1.144769079930414e-06], 
[24.386621898615317, -103.20853717269506, 1.4415610636160767e-05], 
[24.386621898615317, -15.265187103077324, 2.336176900154289e-05], 
[24.386621898615317, 72.67816296654041, 6.529423641084582e-06], 
[24.386621898615317, 160.62151303615815, 2.543931288734254e-07], 
[24.386621898615317, 248.56486310577586, None]],

[[51.20563967205345, -191.1518872423128, 0.0],
[51.20563967205345, -103.20853717269506, 5.935839673713263e-07], 
[51.20563967205345, -15.265187103077324, 1.1023702251181777e-06],
[51.20563967205345, 72.67816296654041, 4.2398854812237604e-07], 
[51.20563967205345, 160.62151303615815, 4.2398854812237616e-08], 
[51.20563967205345, 248.56486310577586, None]],

[[78.02465744549156, -191.1518872423128, None],
[78.02465744549156, -103.20853717269506, None],
[78.02465744549156, -15.265187103077324, None],
[78.02465744549156, 72.67816296654041, None],
[78.02465744549156, 160.62151303615815, None],
[78.02465744549156, 248.56486310577586, None]]

]

遞歸不太復雜:

def lookup(m,ii):
  try:
    for i in ii: m=m[i]
  except IndexError: m=None
  return m
def edge_product(mat1,mat2,path=[]):
  return [edge_product(mat1,mat2,path+[i])\
          for i in range(len(mat1[len(path)]))]\
    if len(path)<len(mat1) else\
    [mat1[i] for i in path]+[lookup(mat2,path)]

請注意,可變的默認參數在這里並不是一個錯誤:它永遠不會突變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM