2016-05-31 289 views
1

我有一個單元格數組VsCell,其維數爲1000x1(或更多)。 VsCell中的每個項目都是501x567矩陣。我想提取佔據單元格中所有矩陣位置的元素。基本上類似於:在matlab單元陣列中選擇第n個元素

VsCell {:}(1,1) - 用於單元格中數組的所有第一個元素 VsCell {:}(2,1) - 對於陣列的所有第2行元素在細胞中。隨後,我打算取這些選擇的平均值或中值,並填充單個[501x567]矩陣陣列,其將表示VsCell陣列的平均值/中值等,例如,平均(VsCell {:}(1,1))。

我試過VsCell {:}(1,1) - 但它返回「壞單元格引用操作」。

此外,有沒有辦法實現這一點很少或沒有for循環/ cellfun? 我無法真正實現這個使用在線發現的例子。

非常感謝您的時間,我很高興進一步澄清,如果需要的話。

回答

3

我不認爲你想要做的事可以用細胞完成,沒有循環或cellfun,也就是說。單元格是異構數據結構,不能保證每個元素都具有兼容的形狀。哎呀,你單元格中的元素編號3甚至可以是另一個單元格,字符串或自定義類實例!我只是說我不覺得奇怪的是,細胞不能以你想要的方式編入索引。

但是,你可以 CON cat enate你的電池爲高維數組,工作與:

VsMat = cat(3,VsCell{:}); % cell as comma separated list 
MatMeans = mean(VsMat,3); % mean along dimension 3, where they are concatenated 
MatMedians = median(VsMat,3); 
MatSums = sum(VsMat,3); 

使用數組應該會更快,無論如何,所以除了單權衡調用cat(這很慢),你可能最好使用同質數組。

+1

非常感謝@Andras!你是對的,我選擇與陣列合作以獲得速度。貓對於這項工作來說不算太壞,因爲考慮到我的數據集可能會變得非常大,所以它比使用嵌套循環做得更好。 – QP1

+0

貓的方法工作正常的數組的大小限制,之後,我得到內存不足的錯誤。你可能有什麼建議嗎?在這一點上我甚至不介意cellfun或循環實現。謝謝 – QP1

+0

@ QP1這很有趣,我認爲在cat()之後得到的數組佔用的空間比單元本身要小。兩種可能的解釋是(1)你的數據太大以至於只有一個副本同時進入內存,所以原始單元+新數組太多,或者(2)'cat'具有內存開銷。在第二種情況下,您可以預先分配'VsMat = zeros([size(VsCell {1},length(VsCell)]);'然後在'k'上設置'VsMat(:,:,k)而不是使用'cat'。在第一種情況下,我不確定是否有簡單的方法,所以首先嚐試第一個;) –