[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Vectorizing loops
From: |
c. |
Subject: |
Re: Vectorizing loops |
Date: |
Sat, 5 Nov 2011 20:41:47 +0100 |
On 5 Nov 2011, at 07:57, andrewcd wrote:
> Hi All,
>
> My code (which works) with all of the loops is:
> G=[]
> for j = 1:columns(N)
> disp(j)
> disp ('of 259')
> for i = 1:rows(N)
> for k = 1:size(N,3)
> G(size(G,1)+1,4) = N(i,j,k);
> G(size(G,1),1) = Nxy(1,j,k);
> G(size(G,1),2) = Nxy(i,1,k);
> G(size(G,1),3) = k;
> end end end
the following seems to work for me:
## construct fake data
Nxy = reshape (1:(30*29*8), [30, 29, 8]);
N = Nxy;
## original code
G = [];
for j = 1:columns(N)
disp (j)
disp ('of 259')
for i = 1:rows(N)
for k = 1:size(N,3)
G(size(G,1)+1,4) = N(i,j,k);
G(size(G,1),1) = Nxy(1,j,k);
G(size(G,1),2) = Nxy(i,1,k);
G(size(G,1),3) = k;
end end end
## vectorized code
X = Nxy(1, :, :);
X = repmat (X, [rows(N), 1, 1]);
Y = Nxy(:, 1, :);
Y = repmat (Y, [1, columns(N), 1]);
T = repmat ([1:size(N, 3)](:), [rows(N)*columns(N), 1]);
X = permute (X, [3, 1, 2]);
Y = permute (Y, [3, 1, 2]);
N = permute (N, [3, 1, 2]);
G1 = [X(:), Y(:), T, N(:)];
## comparison
assert (G1, G)
HTH,
c.