# Generating Toeplitz Matrix which Matches the Convolution Shape Same

7 views (last 30 days)
Royi Avital on 11 Jan 2020
Commented: Royi Avital on 21 Apr 2020
Given a filter vH I'm looking for vectors vR and vC such that:
toeplitz(vC, vR) * vX = conv(vX, vH, 'same');
For instance, for vH = [1, 2, 3, 4] and length(vX) = 7; the matrix is given by:
mH =
3 2 1 0 0 0 0
4 3 2 1 0 0 0
0 4 3 2 1 0 0
0 0 4 3 2 1 0
0 0 0 4 3 2 1
0 0 0 0 4 3 2
0 0 0 0 0 4 3
##### 3 CommentsShow 1 older commentHide 1 older comment
Steven Lord on 13 Jan 2020
The convmtx function from Signal Processing Toolbox comes close to doing what you want. I don't know offhand if there's a function in any MathWorks product that comes closer.
Is there a reason you don't want to simply call conv? [If you're expecting multiplying by the convolution matrix to be faster than calling conv, make sure you time the two operations using timeit to test if you're correct in your expectation.]
Royi Avital on 14 Jan 2020
I just want to generate the matrix specifically with the toeplitz() function.
I acutally can create larger matrix (Matching the full option) and then take a subset of that. But I wonder if I miss something about generating it directly with toeplitz().

Matt J on 14 Jan 2020
Edited: Matt J on 14 Jan 2020
If it must be with toeplitz, then:
nH=numel(vH);
nX=numel(vX);
ic=ceil( (nH+1)/2);
kC=vH(ic:end);
kR=vH(ic:-1:1);
[vC,vR]=deal(sparse(1,nX));
vC(1:length(kC))=kC;
vR(1:length(kR))=kR;
Matt J on 14 Jan 2020
Edited: Matt J on 14 Jan 2020
But note that interpMatrix will be much, much faster than toeplitz for building a sparse mH:
vH=1:12;
vX=rand(1,6000);
nH=numel(vH);
nX=numel(vX);
ic=ceil( (nH+1)/2);
kC=vH(ic:end);
kR=vH(ic:-1:1);
vC=sparse(1,1:numel(kC),kC,1,nX);
vR=sparse(1,1:numel(kR),kR,1,nX);
tic;
mH1=toeplitz(vC,vR);
toc; %Elapsed time is 0.652667 seconds.
tic;
nH=numel(vH);
nX=numel(vX);
ic=ceil( (nH+1)/2);
mH2 = interpMatrix(vH,ic , nX,1);
toc; %Elapsed time is 0.004266 seconds.
>> isequal(mH1,mH2)
ans =
logical
1

Matt J on 13 Jan 2020
Edited: Matt J on 14 Jan 2020
nH=numel(vH);
nX=numel(vX);
ic=ceil( (nH+1)/2);
mH = interpMatrix(vH,ic , nX,1);
##### 3 CommentsShow 1 older commentHide 1 older comment
Royi Avital on 21 Apr 2020
Royi Avital on 21 Apr 2020

Matt J on 13 Jan 2020
Edited: Matt J on 13 Jan 2020
mH=func2mat(@(vX) conv(vX, vH, 'same'), ones(length(vX),1));
Royi Avital on 14 Jan 2020
Hi Matt,
I can generate the matrix in other ways.

### Categories

Find more on Logical in Help Center and File Exchange

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!