如果存在不同類型的單元格,cell2mat
將不起作用。 cell2mat
將單元格合併到矩陣中,但MATLAB 中的矩陣元素必須全部共享相同類型。這對於MATLAB如何處理數字矩陣很重要。如果你沒有完全相同的類型,那麼你應該使用單元陣列......這是他們的目的。
但是,我可以建議的一件事是找出矩陣中所有元素的類型,然後遍歷每個單元格並將它們全部轉換爲最大精度類型。然後,您可以在此中間結果上使用cell2mat
完成轉換。但是,我寫的實際上並不需要最後調用cell2mat
。你會稍後看到。
事情是這樣的:
%// Get all of the possible types in the array
types = unique(cellfun(@class, tempC, 'uni', 0));
%// Figure out the largest type
vals = cellfun(@(x) double(intmax(x)), types);
[~,ind_max] = max(vals);
%// Cast all values to this type
class_max = types{ind_max};
tempC = cellfun(@(x) cast(x, class_max), tempC);
我們首先確定所有的單元陣列包含可能的類。然後我們計算出哪些類型是其中最大的。這可以通過在每種類型上使用intmax
來完成。 intmax
告訴你該類型可用的最大可能整數,所以我們基本上選擇生成最大可能整數的類型。請注意,我必須投到double
,因爲intmax
的輸出肯定會輸出與整數類型相關的最大值,但輸出也是轉換爲該類型的。這是必需的,以便我可以將所有這些元素組合到一個相同類型的數組中 - double
。一旦我們得到產生最大可能整數的類型,然後我們通過單元數組並將所有的值轉換爲這種類型。請注意,我使用cellfun
作爲輸出數字數組的最終調用 - 無需在此處使用cell2mat
。在最後一行代碼中,我使用cast
將單元格數組中的所有數字都轉換爲此類型,從而實現「強制」。
使用你的榜樣陣列,這是我所得到的,以及最終的陣列是在什麼等級:
>> tempC
tempC =
5 16
>> class(tempC)
ans =
uint16
感謝,這是非常有用的。我發現,如果你使用'table2array',這個函數更糟,因爲這個函數似乎強迫它看到它所看到的第一個整數類型。 – Alex
很高興能幫到你!我不知道那個table2array ...呃! – rayryeng