ffriend
ffriend

Reputation: 28492

How are matrices stored in Matlab/Octave?

Short version

If I have matrix like this:

1  2
3  4

In memory, is it stored as [1 2 3 4] or as [1 3 2 4]. In other words, are matrices more optimized for row or for column access?


Long version

I'm translating some code from Matlab to NumPy. I'm used to C convention for multidimensional arrays (i.e. last index veries most rapidly, matrices are stored by rows) which is default for NumPy arrays. However, in Matlab code I see snippets like this all the time (for arrangement several colored images in a single multidimensional array):

images(:, :, :, i) = im

which looks suboptimal for C convention and more optimized for FORTRAN convention (first index veries most rapidly, matrices are stored by columns). So, is it correct that Matlab uses this second style and is better optimized for column operations?

Upvotes: 4

Views: 1314

Answers (2)

Merton
Merton

Reputation: 1

%% Columns
n = 4000;

a = rand(n);
b = zeros(n,1);
tic
for j = 1 : 10
 for ii = 1:n
  b = b + a(:,ii);
 end
end
toc


%% Rows new:
a = rand(n);
b = zeros(1,n);
tic
for j = 1 : 10
 for ii = 1:n
  b = b + a(ii);
 end
end
toc

%% Rows old:
a = rand(n);
b = zeros(1,n);
tic
for j = 1 : 10
 for ii = 1:n
  b = b + a(ii,:);
 end
end
toc

Results:

Elapsed time is 1.53509 seconds.

Elapsed time is 1.03306 seconds.

Elapsed time is 3.4732 seconds.

So it looks like working on rows is SLIGHTLY faster than working on column, but using : causes the slowdown.

Upvotes: -1

Stewie Griffin
Stewie Griffin

Reputation: 14939

Short answer: It is stored column-wise.

A = [1 2; 3 4];
A(:) = [1; 3; 2; 4];

In many cases, the performance can be much better if you do the calculations in the "correct order", and operate on full columns, and not rows.

A quick example:

%% Columns
a = rand(n);
b = zeros(n,1);
tic
for ii = 1:n
  b = b + a(:,ii);
end
toc
Elapsed time is 0.252358 seconds.

%% Rows:
a = rand(n);
b = zeros(1,n);
tic
for ii = 1:n
  b = b + a(ii,:);
end
toc
Elapsed time is 2.593381 seconds.

More than 10 times as fast when working on columns!

Upvotes: 5

Related Questions