2

I don't understand about matlab programming, I just understand coding in python...

here my matrix want to solve

Matlab Code:

 x = ones(3,1).
con = [0.505868045540458,0.523598775598299].
series = [1,2,3] 
for j = 1:2 
   #here stuck to translate Python code#
   x = [x cos(con(j)*series)' sin(con(j)*series)'];
end

Result :

1.0000    0.8748    0.4846    0.8660    0.5000
1.0000    0.5304    0.8478    0.5000    0.8660
1.0000    0.0532    0.9986   -0.0000    1.0000

Anyone help me please, how to solve this problem... Regards!

1
  • Bonus points for including non-random inputs so that we can verify our answer without opening matlab! Commented Sep 2, 2016 at 6:04

2 Answers 2

1

My recreation in an Ipython session (having first tested your code in an Octave session):

In [649]: con = np.array([0.505868, 0.5235897])
In [650]: series = np.array([1,2,3])
In [651]: x = [np.ones((3,))]
In [652]: for j in range(2):
     ...:     x.extend([np.cos(con[j]*series), np.sin(con[j]*series)])
     ...:     
In [653]: x
Out[653]: 
[array([ 1.,  1.,  1.]),
 array([ 0.8747542 ,  0.53038982,  0.05316725]),
 array([ 0.48456691,  0.84775388,  0.99858562]),
 array([  8.66029942e-01,   5.00015719e-01,   2.72267949e-05]),
 array([ 0.49999214,  0.86601633,  1.        ])]
In [654]: np.array(x).T
Out[654]: 
array([[  1.00000000e+00,   8.74754200e-01,   4.84566909e-01,
          8.66029942e-01,   4.99992140e-01],
       [  1.00000000e+00,   5.30389821e-01,   8.47753878e-01,
          5.00015719e-01,   8.66016328e-01],
       [  1.00000000e+00,   5.31672464e-02,   9.98585622e-01,
          2.72267949e-05,   1.00000000e+00]])

In MATLAB the

x = [x cos(...) sin(...)]

is closer to

x = np.concatenate([x, cos(...), sin(...)], axis=?)

but in numpy list append (or in this case extend) is faster. I just had to initial x to the appropriate list.

==================

I can get the same values without the loop

In [663]: y = con[:,None]*series
In [664]: [np.cos(y), np.sin(y)]
Out[664]: 
[array([[  8.74754200e-01,   5.30389821e-01,   5.31672464e-02],
        [  8.66029942e-01,   5.00015719e-01,   2.72267949e-05]]),
 array([[ 0.48456691,  0.84775388,  0.99858562],
        [ 0.49999214,  0.86601633,  1.        ]])]

but it's a bit of a pain to rearrange them into the order produced by iteration, [1, cos, sin, cos, sin].

Sign up to request clarification or add additional context in comments.

1 Comment

Yep, using list here is definitely the right call when you append - the matlab code should be O(S*C*C) since it copies the entire series after each resize, whereas this is only O(C*C + S*C)
0

Here's a solution that entirely removes the loop which resizes the array, which for large len(con) should make this more efficient than the matlab solution , and by association hpaulj's direct translation - this is linear in len(con) rather than quadratic.

import numpy as np

# declare the arrays
con = np.array([0.505868045540458, 0.523598775598299])
series = np.array([1,2,3])

# use broadcasting to generate trig_arg[i,j] = series[i]*con[j]
trig_arg = series[:,np.newaxis] * con

# Add another dimension that is either cos or sin
trig_elems = np.stack([np.cos(trig_arg), np.sin(trig_arg)], axis=-1)

# flatten out the last two dimensions
all_but_ones = trig_elems.reshape(trig_elems.shape[:-2] + (-1,))

# and add the first column of ones
result = np.concatenate([
    np.ones(series.shape)[:,np.newaxis],
    all_but_ones
], axis=-1)

Looking at each step along the way:

# configure numpy output to make it easier to see what's happening
>>> np.set_printoptions(suppress=True, precision=4)
>>> trig_arg
array([[ 0.5059,  0.5236],
       [ 1.0117,  1.0472],
       [ 1.5176,  1.5708]])
>>> trig_elems
array([[[ 0.8748,  0.4846],
        [ 0.866 ,  0.5   ]],

       [[ 0.5304,  0.8478],
        [ 0.5   ,  0.866 ]],

       [[ 0.0532,  0.9986],
        [-0.    ,  1.    ]]])

>>> all_but_ones
array([[ 0.8748,  0.4846,  0.866 ,  0.5   ],
       [ 0.5304,  0.8478,  0.5   ,  0.866 ],
       [ 0.0532,  0.9986, -0.    ,  1.    ]])

>>> result
array([[ 1.    ,  0.8748,  0.4846,  0.866 ,  0.5   ],
       [ 1.    ,  0.5304,  0.8478,  0.5   ,  0.866 ],
       [ 1.    ,  0.0532,  0.9986, -0.    ,  1.    ]])

np.stack is relatively new, but can be emulated with np.concatenate and some np.newaxis slicing. Or you can just go into the numpy source code and copy the new implementation of stack into your project if you're stuck with an older version.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.