Insert Zeros (m -rows) in an existing Matrix every n-rows in an efficient way

3 views (last 30 days)
I've data like this (the actualy matrix is much bigger)
A =
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
Let's say I want to insert 2 rows of zeros (m=2, zeros(2,2)) every 3 lines (n=3), so that the result would be:
A =
1 1
2 2
3 3
0 0
0 0
4 4
5 5
6 6
0 0
0 0
7 7
8 8
9 9
0 0
0 0
10 10
11 11
12 12
0 0
0 0
Is there a quick way to do it? Online I found the "insertrows"-function but that didn't work... Thanks a lot in advance!

Accepted Answer

Azzi Abdelmalek
Azzi Abdelmalek on 6 Jan 2014
[n,m]=size(A)
B=permute(reshape(A',m,3,[]),[2 1 3]);
p=size(B,3)
C=[B;zeros(2,m,p)]
out=reshape( C(:,:),[],m,1)

More Answers (2)

Andrei Bobrov
Andrei Bobrov on 6 Jan 2014
Edited: Andrei Bobrov on 6 Jan 2014
m = 3;
k = 2;
n = size(A);
out = reshape([reshape(A,m,[]);zeros(k,n(1)/m*n(2))],[],n(2));
or
m = 3;
k = 2;
n = size(A);
c = ones(1,n(2));
t = rem((0:n(1)*(k/m+1)-1)',m+k)+1 <= m;
out = t*c
out(t(:,c)) = A;

Jos (10584)
Jos (10584) on 6 Jan 2014
But you can use INSERTROWS:
% data
A = cumsum(ones(12,2),1) % as above
n = 3 ;
m = 2 ;
% engine
B = insertrows(A,0,repmat(n:n:size(A,1),m,1))
btw, I am the author of this function, so I might be a little biased ;-)
  3 Comments
Jos (10584)
Jos (10584) on 6 Jan 2014
The trick is to use the same insertion location multiple times. I acknowledge that this might be a little unclear when reading the documentation.
Jorge Ignacio Cisneros Saldana
It does not work error
Error in Insertzeros (line 30) B = insertrows(A,0,repmat(n:n:size(A,1),m,1));

Sign in to comment.

Categories

Find more on Creating and Concatenating Matrices 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!