如何检查单元格数组中的所有条目是否具有相同的大小?

时间:2014-02-14 13:58:16

标签: matlab

我有一个单元格数组C,其元素是n维数字数组。例如:

C = {[111 121 131; 211 221 231], ...
     [112 122 132; 212 222 232], ...
     [113 123 133; 213 223 233], ...
     [114 124 134; 214 224 234]};

我正在寻找一种方便的方法来测试C中的所有nd数组是否具有相同的形状(由size函数报告)。

这里的平等标准并非完全无足轻重。根据具体情况,您可能希望将[2 3 4]的形状视为与[1 2 3 4][2 1 3 1 4]的形状不同或相等。

出于我的直接目的,我希望将[2 3 4]视为与[1 2 3 4]等不同。

(顺便说一句:订单总是很重要;例如,[2 3 4]永远不会等于[4 3 2],比如说。)

我尝试了几件事(例如,获得unique(C)的长度),但它们都失败了......(经过近两年的使用,我的MATLAB本能仍然接近于零。)

4 个答案:

答案 0 :(得分:6)

针对一个单元格的大小(例如第一个单元格)测试C的每个单元格的大小。要测试大小相等,您需要isequal==不会这样做,因为大小的大小可能不同)。

all(cellfun(@(e) isequal(size(C{1}), size(e)) , C(2:end)))

如果您想将大小[2 3 4]视为等于[1 2 3 4]等,只需添加squeeze

size1 = size(squeeze(C{1}));
all(cellfun(@(e) isequal(size1, squeeze(size(e))) , C(2:end)))

答案 1 :(得分:0)

现在不要在这里使用matlab,但假设C只有1维,这可能会有效

length(C)==1 || any(cellfun(@(cell)size(cell)~=size(C{1}),C(2:end)));

修改:使用~isequal(size(C{1}),size(cell))代替〜=

它相当于

function bool=testCell(C)
if length(C) == 1
  bool=1;
  return
end
for i=2:length(C)
  if ~isequal(size(C{1}),size(cell))
    bool=0;
    return 
  end
end
bool=1

答案 2 :(得分:0)

尝试以下方法:

length(unique(cellfun('size',C,1)))
length(unique(cellfun('size',C,2)))

如果两者都返回1,那么C包含的所有数组都具有相同的size

根据help cellfun

CELLFUN('size',C,K)返回沿着K维的大小     C的每个细胞的内容。

答案 3 :(得分:0)

一个偷偷摸摸(简单)的小技巧是try如果大小不匹配会出现错误,比如连接:

try
    [C{:}]; %// doesn't catch different size(..,2)
    vertcat(C{:}); %// this does, size(..,1) is already consistent at this point
    samesize = true;
catch e
    samesize = false;
end

或递归+(无论如何都是个好主意,尽管您可能希望以更强大的方式实现它):

try rplus(C); samesize = true; catch samesize = false; end

function total = rplus(cell)
    if isscalar(cell), total = cell{1};
    else total = cell{1} + rplus(cell(2:end));
    end
end