Asked by Siddhartha Sharma
on 22 Mar 2018

I have a huge 2464 * 2484 matrix that I want to manipulate and make 2684*2684 but I need the new 220 rows to be divided into 5 rows after every 56 rows of original matrix. I am able to think of loop code --

>> A=csvread('InputWIODRaw.csv');

>> A=csvread('InputWIODRaw.csv');

>> B= zeros(5,2684);

>> CountryVar = [56:56:2464];

>> for i = 1:44

if i==1

j=1;

elseif i>1

j=CountryVar(i-1)+1;

end

ReorderMatrix(i)= A(j:CountryVar(i),:);

Reorder(i) = [ReorderMatrix(i); B];

end

error: =: nonconformant arguments (op1 is 1x1, op2 is 56x2684)

>> for i = 1:44

if i==1

j=1;

elseif i>1

j=CountryVar(i-1)+1;

end

ReorderMatrix(i) = zeros(56,2684);,2684)= A(j:CountryVar(i),:);

parse error:

syntax error

>>> ReorderMatrix(i) = zeros(56,2684);,2684)= A(j:CountryVar(i),:);

^

>> ReorderMatrix(i) = zeros(56,2684);

error: =: nonconformant arguments (op1 is 1x1, op2 is 56x2684)

But not sure how to initialize. Is there a better way if not how to rectify this code? Much appreciated

Answer by Kelly Kearney
on 22 Mar 2018

Accepted Answer

Another approach, which works even if your data doesn't divide evenly:

x = rand(21,6);

nrow = 5; % number of rows of data in each group

nlines = 2; % number of rows of 0s to add after each group

nsets = floor(size(x,1)./nrow);

nextra = rem(size(x,1), nrow);

x = mat2cell(x, [ones(nsets,1)*nrow; nextra], size(x,2));

x = cellfun(@(x) [x; zeros(nlines, size(x,2))], x, 'uni', 0);

x = cat(1, x{:});

Sign in to comment.

Answer by Guillaume
on 22 Mar 2018

You can indeed do it without a loop.

- transpose the matrix so that your rows are columns (since matlab works by column)
- reshape the matrix so that each group of your original 56 rows are now a single column. Thus you end up with a matrix of 44 columns
- vertically concatenate this reshaped matrix with a zero matrix of height 5*width of original matrix and of width 44
- reshape the result back into the right number of rows and columns and transpose back

A = csvread('InputWIODRaw.csv');

B = A.';

B = reshape(B, 56*size(A, 2), []);

B = [B; zeros(5*size(A, 1), size(B, 2))];

B = reshape(B, size(A, 2), []);

B = B.';

Siddhartha Sharma
on 23 Mar 2018

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.