I think the problem here is the transformation of data types from outside spmd to inside. If you create a variable inside an spmd block, outside the spmd block you get a Composite array. The Composite at your client behaves a bit like a cell array, but the contents are actually stored on the workers. When you go back into the spmd block, the Composite data is automatically converted back to the underlying data for each worker. A simple example might help:
parpool('local', 4)
spmd
x = magic(labindex); % x is type 'double'
end
class(x) % gets 'Composite'
size(x) % gets [1,4]
size(x{2}) % gets [2,2] - the element from worker with labindex==2
spmd
class(x) % on the worker, we see the 'double'
size(x) % gets [labindex,labindex] on each worker
end
So, in conclusion, data that appears as a Composite outside the spmd context will be converted back to the underlying data inside the spmd block.