Calculus with Empty Arrays
MATLAB has had empty arrays since before I started using the program. When I started, the only size empty array was 0x0. When version 5 was released, empty arrays came along for the N-dimensional ride and got more shapely.
Contents
Even relatively simple expressions involving empty arrays cause confusion from time to time, especially in concert with other rules in MATLAB (such as NaN values usually propagate from inputs to outputs). Let's play around a little with some empty arrays to get some insight.
From the Newsgroup
This post on the MATLAB newsgroup motivated me to talk about empty arrays. Here's is an excerpt from the original post:
I knew that Nan+4 = NaN, but why is []+4 = [] ? Is there more 'black hole behaviour' I should know about?
Dimensions Matter in MATLAB
Dimensions matter in MATLAB and you will get error messages when dimensions don't agree. Early on, we found it was convenient to treat scalars as an exception with operators (e.g., ,.) and to treat them as if they were expanded to the size of the other operand. So
rand(3,3) + pi
ans = 4.10648118878907 4.09875960183274 3.28347899221701 3.29920573526734 3.62696830231263 3.56335393621607 4.11218543535041 3.94187312247859 4.05732817877886
adds the value pi to the random 3x3 just created. It's as if a 3x3 constant array filled with the value pi was created and added elementwise to the other array.
So what does that mean for an empty operand? Its size has at least one 0 value. So MATLAB expands pi in this expression [] + pi to be the same size as [] (which happens to be 0x0 here). When that happens, MATLAB creates a second empty array, and then adds the two empty arrays. Hence we get
[] + pi
ans = []
returing an empty output.
MATLAB applies the scalar expansion rule to operators. So, for example, size(anything+scalar) is size(anything). As a logical but sometimes surprising consequence, empty arrays often (but not always) propagate through calculations. When doesn't that happen? With some functions where mathematically logical analysis demands different results.
sum([])
ans = 0
prod([])
ans = 1
So, why is the sum zero and the product 1? Because they are the identity elements (as in group theory) for sum and product respectively. Think about how to start the computation for a sum or a product and how you would initialize the first value. That's the value given before adding or multiplying any of the array elements, hence the values 0 and 1 respectively.
Empty Array Shapes
Empty arrays can be N-dimensional, and don't need all dimensions to be 0. However, they still must obey the rules about dimensions needing to agree. There are consequences that may surprise you, but they do follow logically. Here's an example of trying to add two empty arrays, ending up in an error!
a = zeros(0,1) b = zeros(1,0) try a+b catch MEplus fprintf('\n') disp(MEplus.message) end
a = Empty matrix: 0-by-1 b = Empty matrix: 1-by-0 Matrix dimensions must agree.
Reference
For more information about empty arrays, check out this page in the documentation.
Got an Empty Question?
Got any empty questions (really, questions about empty!)? Or comments? Post them here.
- Category:
- Less Used Functionality,
- Robustness,
- Vectorization
Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.