How can I find the length of a cell array in a particular dimension excluding 0x0 doubles?

19 ビュー (過去 30 日間)
Nicole
Nicole 2018 年 8 月 17 日
編集済み: Rik 2021 年 1 月 15 日
As a simple example, say I had this cell array:
examplecell =
{'Name1'} {'Heights'} {'Weights'} {[20000]} {[365]} {[7]}
{'Name2'} {'Heights'} {0x0 double} {0x0 double} {0x0 double} {0x0 double}
{'Name3'} {0x0 double} {0x0 double} {0x0 double} {0x0 double} {0x0 double}
In this 2-D array, I would want to find the number of elements in a specific row which are not {0x0 double}. It is important that the output is for the particular row, not the cell array overall e.g. for the first row the result would be 6, but for the second row it would be 2, and for the third it would be 1. In practice, the cell array is 6-D.

採用された回答

Rik
Rik 2018 年 8 月 17 日
編集済み: Rik 2021 年 1 月 13 日
You can use ~cellfun('isempty',examplecell) to find out if cells are non-empty, and then you can use sum (specifying a dimension) to count the number of non-empty cells in a particular dimension.
Edit:
This method is much faster than cellfun(@isempty,___), but it doesn't work for classes where isempty is overloaded. At least the string, table, and datetime classes are such examples, but there may be more.
examplecell = [{'Name1'} {'Heights'} {'Weights'} {[20000]} {[365]} {[7]};{'Name2'} {'Heights'} {[]} {[]} {[]} {[]};{'Name3'} {[]} {[]} {[]} {[]} {[]}]
examplecell = 3x6 cell array
{'Name1'} {'Heights' } {'Weights' } {[ 20000]} {[ 365]} {[ 7]} {'Name2'} {'Heights' } {0×0 double} {0×0 double} {0×0 double} {0×0 double} {'Name3'} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double}
fprintf('char syntax takes %.2f microseconds\n',1000*1000*timeit(@() ~cellfun('isempty',examplecell)))
char syntax takes 6.14 microseconds
fprintf('handle syntax takes %.2f microseconds\n',1000*1000*timeit(@() ~cellfun(@isempty,examplecell)))
handle syntax takes 16.01 microseconds
(on my machine the difference is even larger: 2 vs 9)
  5 件のコメント
Jingrui Ge
Jingrui Ge 2021 年 1 月 13 日
Thanks for both of your inputs, now it works perfectly! I have no idea if it's a bug though...
Rik
Rik 2021 年 1 月 13 日
編集済み: Rik 2021 年 1 月 15 日
I have now reported it as a bug, so we'll see what Mathworks thinks.
Update:
Since string has an overloaded isempty method this behavior is expected. I could not find where this is documented (which('isempty','-all') did suggest something is different). Support forwarded my service request to the documentation people, so they should now be aware.
I wrote the attached consistency checker to show the issue for the fundamental classes.
% NB: the timings seem to have a larger spread than on a local machine
% it took 3 tries to get time reduction figures that make sense
cellfun_consistency_checker
| Class | isempty(__) | handle syntax | legacy syntax | time reduction | | logical | true | true | true | 11% | | string | true | true | *false* | NaN% | | char | true | true | true | 50% | | int8 | true | true | true | 51% | | int16 | true | true | true | 52% | | int32 | true | true | true | 52% | | int64 | true | true | true | 50% | | uint8 | true | true | true | 49% | | uint16 | true | true | true | 49% | | uint32 | true | true | true | 50% | | uint64 | true | true | true | 49% | | single | true | true | true | 50% | | double | true | true | true | 49% | | table | true | true | *false* | NaN% | | timetable | true | true | *false* | NaN% | | cell | true | true | true | 49% | | struct | true | true | true | 51% |
% (the timetable (which fails), cell, and struct lines seem to be cropped)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeString についてさらに検索

製品


リリース

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by