2015-09-22 43 views
0

當Matlab無法計算出如何在邏輯上存儲不同uint類型的值時,我遇到了一般問題。例如:uint類型之間的強制

tempC = {uint8(5) uint16(16)} 

對於我來說,這似乎是合乎邏輯能夠使用cell2mat(tempC)將其轉換成整數類型的矩陣,它返回

>> cell2mat(tempC) 
Error using cell2mat (line 45) 
All contents of the input cell array must be of the same data type. 

當然,我明白的截斷行爲整數取決於類型(例如uint8強制所有大於255的數字爲255),但是,在這種情況下,我會說這將足夠安全,輸出cell2mat(tempC)uint16類型。有沒有人對如何實現這一目標有任何想法?

回答

1

如果存在不同類型的單元格,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 
+1

感謝,這是非常有用的。我發現,如果你使用'table2array',這個函數更糟,因爲這個函數似乎強迫它看到它所看到的第一個整數類型。 – Alex

+0

很高興能幫到你!我不知道那個table2array ...呃! – rayryeng