What is a simple way to check if a collection of vectors all have the same number of elements
8 ビュー (過去 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
2 件のコメント
Torsten
2023 年 9 月 22 日
Why not renaming a,b,c and d to vecs{1},vecs{2},vecs{3} and vecs{4} ? Should make things easier ...
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
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)
timeit(@()cellfun('prodofsize', vecs),1)
その他の回答 (1 件)
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
6 件のコメント
参考
カテゴリ
Help Center および File Exchange で Function Creation についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!