# MATLAB Language rearrange a ND-array may improve the overall performance

## Example

In some cases we need to apply functions to a set of ND-arrays. Let's look at this simple example.

``````A(:,:,1) = [1 2; 4 5];
A(:,:,2) = [11 22; 44 55];
B(:,:,1) = [7 8; 1 2];
B(:,:,2) = [77 88; 11 22];

A =

ans(:,:,1) =

1   2
4   5

ans(:,:,2) =

11   22
44   55

>> B
B =

ans(:,:,1) =

7   8
1   2

ans(:,:,2) =

77   88
11   22
``````

Both matrices are 3D, let's say we have to calculate the following:

``````result= zeros(2,2);
...
for k = 1:2
result(i,j) = result(i,j) + abs( A(i,j,k) - B(i,j,k) );
...

if k is very large, this for-loop can be a bottleneck since MATLAB order the data in a column major fashion. So a better way to compute "result" could be:

% trying to exploit the column major ordering
Aprime = reshape(permute(A,[3,1,2]), [2,4]);
Bprime = reshape(permute(B,[3,1,2]), [2,4]);

>> Aprime
Aprime =

1    4    2    5
11   44   22   55

>> Bprime
Bprime =

7    1    8    2
77   11   88   22
``````

Now we replace the above loop for as following:

``````result= zeros(2,2);
....
temp = abs(Aprime - Bprime);
for k = 1:2
result(i,j) = result(i,j) + temp(k, i+2*(j-1));
...
``````

We rearranged the data so we can exploit the cache memory. Permutation and reshape can be costly but when working with big ND-arrays the computational cost related to these operations is much lower than working with not arranged arrays. PDF - Download MATLAB Language for free