user3698120
user3698120

Reputation: 61

Rearranging an array using for loop in Matlab

I have a 1 x 15 array of values:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

I need to rearrange them into a 3 x 5 matrix using a for loop:

 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15

How would I do that?

Upvotes: 0

Views: 1145

Answers (3)

user2832896
user2832896

Reputation: 441

A = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] ;
A = reshape( A' , 3 , 5 ) ;
A' = 1     2     3     4     5
     6     7     8     9    10
    11    12    13    14    15

Upvotes: 0

bla
bla

Reputation: 26069

For the sake of (bsx)fun, here is another option...

bsxfun(@plus,1:5,[0:5:10]')

ans =

 1     2     3     4     5
 6     7     8     9    10
11    12    13    14    15

less readable, maybe faster, but who cares if it is such a small of an array...

Upvotes: 2

rayryeng
rayryeng

Reputation: 104464

I'm going to show you three methods. One where you need to have a for loop, and two others when you don't:

Method #1 - for loop

First, create a matrix that is 3 x 5, then keep track of an index that will go through your array. After, create a double for loop that will help you populate the array.

index = 1;
array = 1 : 15; %// Array we wish to access
matrix = zeros(3,5); %// Initialize
for m = 1 : 3
    for n = 1 : 5
         matrix(m,n) = array(index);
         index = index + 1;
    end
end

matrix =

  1     2     3     4     5
  6     7     8     9    10
 11    12    13    14    15

Method #2 - Without a for loop

Simply put, use reshape:

matrix = reshape(1:15, 5, 3).';

matrix =

  1     2     3     4     5
  6     7     8     9    10
 11    12    13    14    15

reshape will take a vector and restructure it into a matrix so that you populate the matrix by columns first. As such, we want to put 1 to 5 in the first column, 6 to 10 in the second and 11 to 15 in the third column. Therefore, our output matrix is in fact 5 x 3. When you see this, this is actually the transposed version of the matrix we want, which is why you do .' to transpose the matrix back.

Method #3 - Another method without a for loop (tip of the hat goes to Luis Mendo)

You can use vec2mat, and specify that you need to have 5 columns worth for your matrix:

matrix = vec2mat(1:15, 5);

matrix =

  1     2     3     4     5
  6     7     8     9    10
 11    12    13    14    15

vec2mat takes a vector and reshapes it into a matrix of as many columns as you specify in the second parameter. In this case, we need 5 columns.

Upvotes: 4

Related Questions