disperse.m

Sam Hallman

 code written: 26 May 2010
 html written: 18 Nov 2011

Demonstration of the DISPERSE function. Oftentimes when using Matlab we find ourselves having to perform a series of repetitive assignments from some kind of array, e.g., a=A(1); b=A(2); c=A(3); . . . etc. Inevitably we ask ourselves, is there a way to do this more simply? DISPERSE is syntactic sugar for performing these kinds of tasks with a single function call.

The following examples illustrate the behavior of DISPERSE on different collection classes.

Contents

Vectors

Grab elements of vectors

foo = rand(1,4)
[a b c d] = disperse(foo)
foo =

    0.4094    0.3654    0.8578    0.9957


a =

    0.4094


b =

    0.3654


c =

    0.8578


d =

    0.9957

Can grab a subset if you like

v = rand(1,5)
[a b c] = disperse(v([1 4 5]))
v =

    0.9096    0.7282    0.6020    0.0011    0.2741


a =

    0.9096


b =

    0.0011


c =

    0.2741

Matrices

Grab columns of a matrix

A = rand(2)
[c1 c2] = disperse(A)
A =

    0.3656    0.2508
    0.2083    0.7516


c1 =

    0.3656
    0.2083


c2 =

    0.2508
    0.7516

Transpose if you want rows

[r1 r2] = disperse(A')
r1 =

    0.3656
    0.2508


r2 =

    0.2083
    0.7516

N-D arrays

disperse generalizes to arrays of arbitrary dimension

A = rand(5,3,4,9,7);
% pick off A(:,:,:,:,1) and A(:,:,:,:,2)
[a b] = disperse(A);

it worked:

whos A a b
isequal(a, A(:,:,:,:,1))
isequal(b, A(:,:,:,:,2))
  Name      Size            Bytes  Class     Attributes

  A         5-D             30240  double              
  a         4-D              4320  double              
  b         4-D              4320  double              


ans =

     1


ans =

     1

RGB images (special case)

The techniques of the previous section are especially handy for RGB images:

% Grab the R, G, and B color channels
im = imread('street1.jpg');
[r g b] = disperse(im);

it worked:

whos im r g b
isequal(r, im(:,:,1))
isequal(g, im(:,:,2))
isequal(b, im(:,:,3))
  Name        Size                Bytes  Class    Attributes

  b         480x640              307200  uint8              
  g         480x640              307200  uint8              
  im        480x640x3            921600  uint8              
  r         480x640              307200  uint8              


ans =

     1


ans =

     1


ans =

     1

Cells

Grab elements of cells

c = { 'sam', -1, rand(5) }
[c1 c2 c3] = disperse(c)
c = 

    'sam'    [-1]    [5x5 double]


c1 =

sam


c2 =

    -1


c3 =

    0.2945    0.0056    0.9591    0.9123    0.1125
    0.6334    0.0572    0.8658    0.1883    0.6698
    0.5971    0.0029    0.2624    0.4064    0.2496
    0.7556    0.5436    0.4880    0.2552    0.6699
    0.6972    0.7148    0.4085    0.7605    0.3863

You can go further

c = { 'foo' {} ; [1,2;3,4] 'bar' }
[a b] = disperse(c)
c = 

    'foo'              {}
    [2x2 double]    'bar'


a = 

    'foo'
    [2x2 double]


b = 

    {}
    'bar'

Structs

Grab elements of structure arrays

s = struct('strings', {'sam','hello'}, 'lengths', [3 5])
[a b] = disperse(s)
s = 

1x2 struct array with fields:
    strings
    lengths


a = 

    strings: 'sam'
    lengths: [3 5]


b = 

    strings: 'hello'
    lengths: [3 5]