2016-03-15 47 views
0

我有一個1xN結構數組,其中包含一個存儲矢量v的字段。一般地,N> 2。如何比較1xN結構數組中的矩陣尺寸

我使用arrayfun功能,以檢查是否那些v矢量相同的所有結構陣列中的N個元素的:

if all(arrayfun(@isequal,matrix.v)) 

問題是我目前要檢查所有v矢量在調用上面的行之前是否具有相同的大小。我不能使用arrayfun,因爲它需要所有參數具有相同的尺寸。

當N = 2,是沒有問題的,因爲我可以簡單地這樣做

if length(matrix(1).v) == length(matrix(2).v) 

然而,對於一般情況下(N> 2),我怎樣才能使這個維度驗證?

謝謝!

回答

3

您可以使用自己的功能讓您的結構尺寸:

[nrows, ncols] = arrayfun(@(x) size(x.v), matrix) 

現在你只需要確保nrowsncols是爲matrix.v都是一樣號碼,這樣你可以做

samesize=length(unique(nrows))==1 && length(unique(ncols))==1; 
+0

謝謝,但它不起作用,因爲'matrix.v'的元素有不同的大小,所以'arrayfun '返回這個錯誤(對於N = 2): '使用arrayfun時出錯 所有輸入參數必須具有相同的大小和形狀。 之前的輸入在尺寸2中的尺寸爲36.輸入#3的尺寸爲51.' – baister

+0

@baister已更新 –

1

一種替代,是trycatch的錯誤,因爲你只希望這個錯誤,這並不像安德的答案一樣好,但它是可選擇性的E:

try 
    all(arrayfun(@isequal,matrix.v)) 
catch exception %//Same as if it throws an error 
    %//...your statements...%// 
    %//you could do something like ans = 1 since anw will equal 0 if all(arrayfun(@isequal,matrix.v)) is true 
end 

例如:

value = {[1,2,3]; 
[10, 20, 30]; 
[100,200,300,400]}; 
s = struct('f',value); 
try 
    all(arrayfun(@isequal,s.f)) 
catch exception 
    ans=1 
end 

>> ans = 1 

但這並不關心例外的是什麼,所以如果你的代碼是由不同的錯誤打破,它仍然會繼續給予1答。一個好處是它只評估一次arrayfun:D所以速度更快(我認爲?)