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

22 次查看(过去 30 天)
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 个评论
Bruno Luong
Bruno Luong 2023-9-22
编辑:Bruno Luong 2023-9-22
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')

请先登录,再进行评论。

采纳的回答

Bruno Luong
Bruno Luong 2023-9-22
编辑:Bruno Luong 2023-9-22
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 个)

Walter Roberson
Walter Roberson 2023-9-22
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 个评论
Jon
Jon 2023-9-22
编辑:Jon 2023-9-22
@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

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Function Creation 的更多信息

产品


版本

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by