2014-02-14 81 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 
相關問題