def print_as_array(m, mname, sufix=None, use_cse=False, header=None,
print_file=True, collect_for=None, pow_by_mul=True, order='C',
op='+='):
ls = []
if use_cse:
subs, m_list = sympy.cse(m)
for i, v in enumerate(m_list):
m[i] = v
if sufix is None:
namesufix = '{0}'.format(mname)
else:
namesufix = '{0}_{1}'.format(mname, sufix)
filename = 'print_{0}.txt'.format(namesufix)
if header:
ls.append(header)
if use_cse:
ls.append('# cdefs')
num = 9
for i, sub in enumerate(subs[::num]):
ls.append('cdef double ' + ', '.join(
map(str, [j[0] for j in subs[num*i:num*(i+1)]])))
ls.append('# subs')
for sub in subs:
ls.append('{0} = {1}'.format(*sub))
ls.append('# {0}'.format(namesufix))
num = len([i for i in list(m) if i])
ls.append('# {0}_num={1}'.format(namesufix, num))
if order == 'C':
miter = enumerate(np.ravel(m))
elif order == 'F':
miter = enumerate(np.ravel(m.T))
miter = list(miter)
for i, v in miter:
if v:
if collect_for is not None:
v = collect(v, collect_for, evaluate=False)
ls.append('{0}[pos+{1}] +='.format(mname, i))
for k, expr in v.items():
ls.append('# collected for {k}'.format(k=k))
ls.append(' {expr}'.format(expr=k*expr))
else:
if pow_by_mul:
v = str(v)
for p in re.findall(r'\w+\*\*\d+', v):
var, exp = p.split('**')
v = v.replace(p, '(' + '*'.join([var]*int(exp)) + ')')
ls.append('{0}[pos+{1}] {2} {3}'.format(mname, i, op, v))
string = '\n'.join(ls)
if print_file:
with open(filename, 'w') as f:
f.write(string)
return string
评论列表
文章目录