2017-08-14 15 views
0

工作區中存在具有不同向量長度的向量。我有一個包含向量名稱的字符串單元格。我想用cellfun來吐出這些向量的長度。將名稱存儲在單元格中的向量長度比較

例如,

t1 = 1x10 double 
t2 = 1x100 double 
t3 = 1x20 double 
cel = {'t1','t2','t3'}; 

cellfun(@(c) eval(['length(',c{:},')']),cel) 

我以爲做以下將做的工作,但事實並非如此。我有理由爲什麼我需要使用cellfun和eval來解決這個問題。

有人可以指出有什麼問題嗎?我得到的錯誤消息是:

cellfun(@(c) eval(['length(',c{:},')']),cel) 
Cell contents reference from a non-cell array object. 

cellfun(@(c) eval(['length(',c(:),')']),cel) 
Error using horzcat 
Dimensions of matrices being concatenated are not consistent. 

cellfun(@(c) eval(['length(',[c{:}],')']),yvar) 
Cell contents reference from a non-cell array object. 

取決於我試過的變化。

或更好。最終目標是檢查所有矢量的長度是否相同。如果有一種方法可以不循環,那就太棒了。

+0

這看起來像一個很好的理由來改變你的代碼,所以你不需要'eval'。另外,'cellfun'是一個循環,並且幾乎總是比顯式循環慢,所以你不會真的在那裏保存任何東西。 – excaza

+0

非常感謝您提供的信息。 – Eric

回答

0

您可以使用whos

L={} 
for ct = 1:length(cell) 
    w=whos(cel{ct}); 
    L{ct} = w.size; 
end 

,我和評論表示贊同。重寫代碼,所以你不需要怪異的解決方法。

2

我有理由爲此問題需要使用cellfuneval

這個問題,那是一定要遵守的問題,是夢幻般的原因使用eval。永遠。永遠永遠。它很難調試,速度很慢(MATLAB的JIT編譯器忽略了eval語句),它使得幾乎所有的事情都比需要的複雜得多。

例如:

t1 = rand(1, 10); 
t2 = rand(1, 100); 
t3 = rand(1, 20); 
t4 = rand(1, 1, 20); 
cel = {'t1', 't2', 't3', 't4'}; 

ws = whos(); 
tmp = {ws.name}; 
sizes = {ws(ismember(tmp, cel)).size} 

如果你絕對,完全,嚴重不能避免使用eval(即很少存在的情況下),你可以使用whos可選輸出湊齊東西返回匹配變量大小的單元格數組,您可以使用它來進行所需的任何進一步分析。

如果你知道你的數據只會是二維的,你可以將大小的信息到一個數組,reshape它的東西很容易解析的視覺:

t1 = rand(1, 10); 
t2 = rand(1, 100); 
t3 = rand(1, 20); 
cel = {'t1', 't2', 't3'}; 

ws = whos(); 
tmp = {ws.name}; 
sizes = reshape([ws(ismember(tmp, cel)).size], 2, []).'; 

whos還支持regular expressions ,它允許您根據模式匹配變量,而不必填充單元陣列:

t1 = rand(1, 10); 
t2 = rand(1, 100); 
t3 = rand(1, 20); 
v1 = rand(1, 30); 
time = rand(1, 5); 

ws = whos('-regexp', 't\d+'); 
tmp = {ws.name}; 
sizes = reshape([ws.size], 2, []).'; 
+0

我努力不使用eval。在我的巨大代碼中確實是罕見的情況。謝謝。 – Eric