What is a simple way to check if a collection of vectors all have the same number of elements

I am look for a nice simple way to check if a collection of vectors all have the same number of elements. For example this might be used to validate some inputs to a function, or otherwise check compatibility before performing other operations.
Here's my current approach, which works, but I wonder if someone has simpler way of doing the same thing
a = rand(3,1);
b = rand(3,1);
c = rand(4,1);
d = rand(3,1);
vecs = {a,b,c,d};
n = cellfun(@numel,vecs);
if any(n(1)~=n)
error('all vectors must be same length')
end
all vectors must be same length

2 Comments

Why not renaming a,b,c and d to vecs{1},vecs{2},vecs{3} and vecs{4} ? Should make things easier ...
I'm half serious but:
The simplest way? IMO just don't do any check, just rely on MATLAB, if any operation on vecs with incompatible sizes will imply error, just let MATLAB throw an error instead of
error('all vectors must be same length')

Sign in to comment.

 Accepted Answer

if any(n(1)~=n)
The above will crash if your cell is empty.
IMO
if any(diff(n))
is a more robust test. Thus you can do the test in a single statement
if any(diff(cellfun(@numel,vecs)))
% ...
end
And last but not least, if performance matters, use this
if any(diff(cellfun('prodofsize',vecs)))
% ...
end
instead of @numel.
Here is why
vecs = arrayfun(@(x) zeros(randi(10),1), 1:1e6, 'unif', 0);
timeit(@()cellfun(@numel, vecs),1)
ans = 0.7885
timeit(@()cellfun('prodofsize', vecs),1)
ans = 0.0098

1 Comment

Thanks, very much, I will look into this too. Away for a week, no MATLAB, but will review again when I get back

Sign in to comment.

More Answers (1)

a = rand(3,1);
b = rand(3,1);
c = rand(4,1);
d = rand(3,1);
vecs = {a,b,c,d};
n = cellfun(@numel,vecs,'uniform',0);
if ~isequal(n{:})
error('all vectors must be same length')
end
all vectors must be same length

6 Comments

Using 'length' instead of @numel might have some benefit (in certain circumstances).
@Dyuman Joshi: can you give an example? In general the advice given on this forum is to avoid LENGTH due to its changing dimensions without warning... a behavior that is certainly the cause of a few threads on this forum.
The idea behind my comment is that, that the use of some functions being slower than using the function names as strings for cellfun, such as for length, isempty etc.
I am aware of the consensus of the community for length and I personally advocate for the use of numel over length as well.
But in some obscure case, it might have some benefit.
Edit - @Bruno has implemented another such function - 'prodofsize' in their answer, and you can see that there is significant performance difference.
L = randi([0 10], 1, 50);
vecs = arrayfun(@(L) rand(1,L), L, 'uniform', 0);
timeit( @() cellfun(@numel,vecs,'uniform',0), 1)
ans = 4.3728e-05
timeit( @() num2cell(cellfun('length',vecs)), 1)
ans = 8.9095e-06
There is an oddity that when you pass a character vector for the function name, cellfun does not accept any options such as uniformoutput
The difference in timings above is not large on an absolute scale, so one should wonder whether the difference is within measurement error -- but it was pretty consistent here on MATLAB answers over several experiments
@Walter Roberson That's neat, I didn't realize that isequal could take a variable number of input arguments, e.g. n{:},
I also thought about, using a try catch block something like below. I think my original approach (incorporating Walter's suggested modifications), seems cleaner than the try-catch. Maybe this is just a subjective issue, but wondered whether anyone has any thoughts on comparing the two ways and which approach is "better".
a = rand(3,1);
b = rand(3,1);
c = rand(4,1);
d = rand(3,1);
try
M = horzcat(a(:),b(:),c(:),d(:))
catch
error('all vectors must be same length')
end
all vectors must be same length
Also, a very good answer, and good discussion, but I could only accept one. Thanks for all of your help.

Sign in to comment.

Products

Release

R2023a

Asked:

Jon
on 22 Sep 2023

Commented:

Jon
on 2 Oct 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!