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

8 Ansichten (letzte 30 Tage)
Jon am 22 Sep. 2023
Kommentiert: Jon am 2 Okt. 2023
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 KommentareKeine anzeigenKeine ausblenden
Torsten am 22 Sep. 2023
Why not renaming a,b,c and d to vecs{1},vecs{2},vecs{3} and vecs{4} ? Should make things easier ...
Bruno Luong am 22 Sep. 2023
Bearbeitet: Bruno Luong am 22 Sep. 2023
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')

Melden Sie sich an, um zu kommentieren.

### Akzeptierte Antwort

Bruno Luong am 22 Sep. 2023
Bearbeitet: Bruno Luong am 22 Sep. 2023
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
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 Kommentar-1 ältere Kommentare anzeigen-1 ältere Kommentare ausblenden
Jon am 22 Sep. 2023
Thanks, very much, I will look into this too. Away for a week, no MATLAB, but will review again when I get back

Melden Sie sich an, um zu kommentieren.

### Weitere Antworten (1)

Walter Roberson am 22 Sep. 2023
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 Kommentare4 ältere Kommentare anzeigen4 ältere Kommentare ausblenden
Jon am 22 Sep. 2023
Bearbeitet: Jon am 22 Sep. 2023
@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
Jon am 2 Okt. 2023
Also, a very good answer, and good discussion, but I could only accept one. Thanks for all of your help.

Melden Sie sich an, um zu kommentieren.

### Kategorien

Mehr zu Calendar finden Sie in Help Center und File Exchange

R2023a

### Community Treasure Hunt

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

Start Hunting!

Translated by