# Replace elements in a SxS matrix with zero, in each column but in different rows

1 view (last 30 days)
Miroslav Josic on 1 Feb 2017
Commented: Miroslav Josic on 2 Feb 2017
Hi people,
I know how to simply replace elements with zero, but I'm stuck with this problem. I have a matrix 2108x62 and I need to replace elements in column #1 and row 1-34 by zero, then in column #2 but row 35-68, then column #3 but row 69-102 etc to the end of column 62 and row 2075-2108.
Best,
Miroslav

Stephen23 on 1 Feb 2017
Edited: Stephen23 on 1 Feb 2017
This is simple using either the FEX submission expand:
>> mat = randi(9,2108,62);
>> idx = expand(eye(62)==1,[2108/62,1]);
>> mat(idx) = 0;
or for newer MATLAB versions repelem:
>> idx = repelem(eye(62)==1,2108/62,1);
Miroslav Josic on 2 Feb 2017
Hi Stephen,
Thanks a lot for your quick reply. It works perfectly using repelem function.
I really appreciate your help on this!
Best,
Miroslav

David J. Mack on 1 Feb 2017
Edited: David J. Mack on 1 Feb 2017
Hey Miroslav,
have you looked at the sub2ind function? Should be something like the following.
% Let M be your 2108*64 matrix.
iRow=(1:2108)'; %Row indicesin i-j notation
jCol=floor(iRow/34)+1; %Column indices using DIV in i-j notation
ind=sub2ind([2108 62],iRow,jCol); %Linear indices (e.g. 1,1 = 1; n,m=n*m)
M(ind)=0;
Greetings, David
Miroslav Josic on 2 Feb 2017
Hi David,
Unfortunately, it doesn't help much, it says "Out of range subscript". Probably because i get in j column, 1 for rows 1-33 (so the window is 33 actually), then the window is 34 for the rest of the rows. In the end, I miss one row in the sample, therefore the value for last row 2108 is 63.
Miroslav