2014-02-14 77 views
5

我有一个单元阵列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]不同等

(BTW:为了始终事项;例如,[2 3 4]是永远等于[4 3 2],说)

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

+0

@Dan:我的意思是“大小”由(名字不多的)'size'函数返回;对困惑感到抱歉;我编辑了我的帖子,使其更清晰。 – kjo

回答

6

测试每个单元格的大小为C针对大小一个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))) 
+0

'isequal'很好的搭档 – KitsuneYMG

+1

谢谢;这适用于我,但只有在我用'C {1}'替换了'C(1)'的提及之后。 (顺便提一下,X(i)'和'X {i}'之间的这种区别,以及何时使用它,属于MATLAB的许多方面,出于某种原因,从未“记忆”我的记忆。) – kjo

+0

@kjo你是对的。编辑。我也经常对此感到困惑! –

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 
0

尝试以下操作:

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

如果都返回1,再由C含有所有阵列具有相同的size

根据help cellfun

CELLFUN( '尺寸',C,K)返回沿C.的每个单元的 内容的第K个维度的尺寸

+0

这假定每个单元格的内容只有两个维度 –

+0

是的,没错。但是通过改变参数K它可以很容易地扩展到更大的维度。即使你的解决方案更一般化,我也试图指出OP可以使用他/她已经尝试过的'独特'方法。 –

+0

但是,阵列的最大维数不是事先知道的。你需要一个以前的'cellfun'来确定 –

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 
相关问题