matlab中计算单元阵列行中的列数

matlab中计算单元阵列行中的列数,matlab,image-processing,cell-array,Matlab,Image Processing,Cell Array,我有一个充满数字的单元格数组,有44行,每行有不同的列长度 如何计算每行中的列数?(其内容不为空的列) 我使用了两种不同的方法,这两种方法都是错误的 第一个: %a is the cell array s=length(a) 它给出44,这是行数 第二个 [row, columms]=size(a) 但它也不起作用,因为每行的列数不同。 至少我指的是不为空的列数 例如,我需要第1行中的列数,它是43(a{11:43}),但它给出了每个元素的列数,比如a{1,1}是384或a{1,2},a{1

我有一个充满数字的单元格数组,有44行,每行有不同的列长度
如何计算每行中的列数?(其内容不为空的列)
我使用了两种不同的方法,这两种方法都是错误的
第一个:

%a is the cell array
s=length(a)
它给出44,这是行数

第二个

[row, columms]=size(a)
但它也不起作用,因为每行的列数不同。
至少我指的是不为空的列数

例如,我需要第1行中的列数,它是43(a{11:43}),但它给出了每个元素的列数,比如a{1,1}是384或a{1,2},a{1,3},等等。您需要分别访问单元格数组的每个成员,您正在查找单元格中包含的数据的大小-单元格是容器。两种方法

for循环:

cell_content_lengths=zeros(1,length(a));
for v=1:length(a)
    cell_content_lengths(v)=length(a{v});
end
cellfun:

cell_content_lengths=cellfun(@length,a);
任何空单元格的长度都只有
0
。将for循环扩展到矩阵是很简单的,如果您感兴趣,可以使用以下方法将cellfun部分扩展到包含矩阵的单元格:

cell_content_sizes=cell2mat(cellfun(@length,a,'uniformoutput',false));
(请注意,对于上述内容,
a
的每个元素都需要具有相同的维度,否则它将给出关于连接不同大小矩阵的错误)

编辑

根据你的评论,我想我了解你在寻找什么:

non_empty_cols = sum(~cellfun(@isempty,a),2);

感谢@MZimmerman6在我之前就理解了它。

所以你真正想问的是,“我的单元格数组中每行有多少个非空元素?”


您必须对cellfun的结果进行求和,尤其是每个单元格包含多个其他单元格,因此它可以是
sum(cellfun(@length,a),2)
如果我了解原始post-@samdean正在查找每个单元格元素数据的大小,则不必求和。我认为这不正确的唯一原因是,他提到了空内容单元格,如果是纯二维单元格数组,则会出现空内容单元格。这没有给出正确的答案。我为一个选定的示例尝试了这段代码,我知道每行的列数是43,但它给了我一行中每个元素的列数是384。例如,我需要第一行中的列数,它是43(a{11:43}),但它给出了每个元素的列数,比如a{1,1},它是384,或者a{1,2},a{1,3},等等,我并不需要它(谢谢)@HughNolan顺便说一句,用字符串函数检查
cellfun
,即:
cellfun('length',…)
cellfun('isempty',…)
。令人惊讶的是,他们是…@samdean,我想我现在明白了。编辑了我的答案。仅供参考,
cellfun('isempty',a)
要快得多(请看休的答案)。@EitanT-谢谢你的提示!它给出了正确的答案,但是在运行程序3次之后,会出现这样的错误:“索引超过了矩阵维数”。除非我关闭matlab并再次运行,否则错误不会消失。问题是什么?@samdean-没有更多的信息很难知道。在这三次跑步中发生了什么变化?哪一行具体导致错误?
filledCells = ~cellfun(@isempty,a);
columns = sum(filledCells,2);