How to convert a vector to a toeptliz matrix in tensorflow 2.5?

Given a vector = [1, 2, 3, 4, 5,6]

Is there a function which can convert it in to a Toeptliz matrix of 4 columns as given below ?

[ [1,2,4,5],[2,4,5,6], [3, 4,5,6]

I want to apply this transform to a batch of vectors.

1 Like

I think tf.linalg.LinearOperatorToeplitz is what you’re looking for

No, that does this

col = [1., 2., 3.]
row = [1., 4., -9.]

operator = LinearOperatorToeplitz(col, row)operator.to_dense()

[[1., 4., -9.],     [2., 1., 4.],     [3., 2., 1.]]

my requirement is different.

1 Like

Currently I use the following function do it. I would like to know whether there is any builtin function does it, so that I can avoid the for loop used here.

tf.stack([ Inf[ i:i+ width] for i in range(length-width+1)])

1 Like

I don’t understand your 4 columns output Matrix example.

[ [1,2,4,5],[2,4,5,6], [3, 4,5,6]

Is it a Toeplitz matrix?

1 Like

I still think the operation mentioned is the solution (it’s actually more general that what OP asks for, but can me made to work for OP’s case):

>>> import tensorflow as tf
>>> v = [1, 2, 3, 4, 5,6]
>>> tf.linalg.LinearOperatorToeplitz(v, v).to_dense()
<tf.Tensor: shape=(6, 6), dtype=int32, numpy=
array([[1, 2, 3, 4, 5, 6],
       [2, 1, 2, 3, 4, 5],
       [3, 2, 1, 2, 3, 4],
       [4, 3, 2, 1, 2, 3],
       [5, 4, 3, 2, 1, 2],
       [6, 5, 4, 3, 2, 1]], dtype=int32)>

Let’s say input vector is,
`v = [1, 2, 3, 4, 5, 6, 7,…100],

If I want to get a output matrix with number of columns 6, then output is

 [ [ 1, 2 ,  3, 4, 5, 6 ], 
   [ 2, 3, 4, 5, 6,  7 ] ,
   [ 3, 4, 5, 6,  7, 8 ], 
     ............., 
  [ 95, 96, 97, 98, 99,100 ] ]

`
I don’t think tf.linalg.LinearOperatorToeplitz(v, v).to_dense() will give the above output.

1 Like

I made a mistake. That’s is not a toeplitz matrix.

I am looking for tensorflow equivalent of below method in pytorch

x = torch.arange(1., 8)
x
tensor([ 1., 2., 3., 4., 5., 6., 7.])

x.unfold(0, 2, 1)
tensor([[ 1., 2.],
[ 2., 3.],
[ 3., 4.],
[ 4., 5.],
[ 5., 6.],
[ 6., 7.]])

x.unfold(0, 2, 2)
tensor([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]])

1 Like

For these specific input cases you can use

import tensorflow as tf
x = tf.range(1,8)
out_frame_2_1 = tf.signal.frame(x, 2, 1)
out_frame_2_2 = tf.signal.frame(x, 2, 2)
print(out_frame_2_1)
print(out_frame_2_2)

But more in general for pytorch unfold see

https://www.tensorflow.org/api_docs/python/tf/image/extract_patches

For more complex use cases you could have some performance issues to solve. See:

2 Likes

Thanks. This is what I was looking for.

1 Like