# How to repshape array to matrix with different length of each row ?

3 views (last 30 days)
Willim on 22 Mar 2020
Commented: Willim on 22 Mar 2020
Lets assume we have array M with size 1*100
M= [1 2 3 4 5 6 7 8 9 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 9 2 ....]
I need to rephase it to B matrix that have 12 rows with max column 9
B = [1 2 3 4 5 6 7 8 9 ; 0 1 1 1 1 1 1 1 NAN ; 1 1 2 2 2 2 2 2 9 2; ... etc]
if we notice the first row is 1*9
second row is 1*8
third row is 1*10
and so on until we fill all the 12 rows. The sizes for the rows [9 8 10 8 9 8 8 8 8 9 8 7]
I just make up this example becuase my array is too long and I need to divid it depend on three numbers which is 28, 31,30
I tried to make if loop to implmemt it but I cannot it's completely worng.

Cris LaPierre on 22 Mar 2020
MATLAB has the function reshape, but there are a couple things to be aware of when using it:
1. The number of elements can't change, meaning the product of the dimensions of your array have to exactly match the product of the dimensions of your array.
2. Each row/column will have the same number of elements (unless you want to get into cell arrays)

Willim on 22 Mar 2020
RowS=1
RowE=0
for i=1:1:12
RowE=RowE+MDN(i);
Divided_LD(i,:)=LD(RowS:RowE)
RowS=RowS+RowE;
end
I have error
MDN is the length of each row
Unable to perform assignment because the size of the left side is 1-by-744 and the size of the right side is 1-by-672.
This is for my M-file the main array too long for the orginal M-file
Cris LaPierre on 22 Mar 2020
Here's a sample assuming the vector is 1x100
% Create dummy data
test = randi(20,[1 100]);
brks = [9 8 10 8 9 8 8 8 8 9 8 7]
ind = [0 cumsum(brks)]
% preallocate vector with NaNs
matrix = nan([12 max(brks)])
for r = 1:length(brks)
matrix(r,1:brks(r)) = test((ind(r)+1):ind(r+1));
end
Willim on 22 Mar 2020
This works Thank you