• Register

Avtomatizacija dvojne vsote matrike

+3 votes
445 views

Pozdravljeni,

Za obrazložitev mojega problema sem sestavil spodnji, poenostavljen primer:

Želim torej narediti dvojno vsoto matrike. Zaenkrat mi je uspelo skupaj spraviti tole:

from sympy import*
import numpy as np
init_printing()

x, y = symbols('x, y')

mat = Matrix([[x,1],[1,y]])

X = [1, 2, 3]
Y = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]

Mat = Matrix(sum([sum([np.asarray([[x,1], [1,y]]) for y in yr]) for x, yr in zip(X,Y)]))
Mat

Koda sicer deluje pravilno,  vendar tak način ne pride v poštev v primeru večjih matrik, saj bi moral vsako vrstico prepisovati znotraj array-a. Zanima me, kako bi se to lahko najlažje avtomatiziralo (mogoče z dodatno for zanko, ki deluje za vsako vrstico matrike?).

 

Hvala za pomoč.

 

LP

T

 

 

asked May 27, 2016 by tonc (690 points)

2 Answers

+1 vote
 
Best answer
Sedaj mi je uspelo. Zadevo sem sicer nekoliko drugače zastavil in sicer in sem opredelil funkcijo, ki za vsako kombinacijo vrednosti matriko shrani v list, na koncu pa preko funkcije sum dobim iskano dvojno vsoto. Primer je nekoliko drugačen, a če bo slučajno komu prišlo prav:

 

test = Matrix([[T, logS, T**2],[T, logS**2, 1],[-1, logS**2, -T]])

def enacba_12(mat, temp, nap):
    mat_12 = mat.subs(T, temp)
    mat_12 = mat_12.subs(logS, nap)
    return np.asarray(mat_12)
A = []
for i in range(len(Temp)):
    for j in range(len(Nap[i])):
        A.append(enacba_12(test, Temp[i], Nap[i][j]))
sum(A)

 

Hvala za pomoč in vaš čas.

Lp
answered May 28, 2016 by tonc (690 points)
selected Jul 11, 2016 by tonc
+3 votes

Pozdravljeni!

Najprej: ne bi reševal simbolno (če je numerični problem)!

Ker gre za vsoto, jo je v tem primeru smotrno izvesti za vsak element posebej. 

Možna rešitev je taka:

x = np.asarray(X)
y = np.asarray(Y)

x = np.asarray(X)
y = np.asarray(Y)
np.array([[np.sum(x)*len(y), len(x)*len(y)],
          [len(x)*len(y), np.sum(y)]])

Pri zgoraj navedenih matrikah, sympy rešitev traja (na mojem računalniku): 120mikrosekund, numpy pa 9mikrosekund. Z večanjem matrik pričakujem večje razlike. Verjamem, da se da kodo še pohitriti. Sam bi morebiti probal z numba @jit: http://numba.pydata.org/numba-doc/0.17.0/user/jit.html

answered May 27, 2016 by janko.slavic (81,340 points)
Hvala za odgovor. Sicer kar ste zapisali deluje, ampak v mislih sem imel bolj to, da se sumacija izvede ne glede na obliko same matrike in njene notranje komponente. Ker tako kot ste vi zapisali je prilagojeno za podani primer, jaz pa bi rad za poljubno matriko poljubne velikosti, torej z drugimi besedami - rad bi naredil splošen zapis, ki v matriko na na mestih spremenljivk le te nadomesti in izvede vsoto. LP
Gre namreč zato, da rešujem set različnih enačb, ki ga moram najprej razrešiti na simbolni ravni. Ko enkrat uspem iz seta enačb zapisati matrike na simbolni ravni, moram simbole oziroma spremenljivke nadomestiti z dejanskimi vrednostmi. Te matrike so različnih velikosti, zato bi nekako rad zapisal splošen zapis ki izvede dvojno sumacijo glede na podane podatke.
...