2016-09-08 60 views
2

我需要幫助在MATLAB中創建一個單元格數組,其中每個單元格都是不同大小的數組。舉例來說,假設我有這個簡單的數組和值:一次性在MATLAB中給單元格數組賦值不同的值

A = [5 3 8 7 0 4 1]; 
B = 10; 

單元陣列C必須創建這樣的:

C = 
[10 20 30 40 50] 
[10 20 30] 
[10 20 30 40 50 60 70 80] 
[10 20 30 40 50 60 70] 
[Empty matrix 1x0] 
[10 20 30 40] 
[10] 

是否有可能做到這一點只在一個操作?我曾嘗試過:

C = cellfun(@(a,b)b*ones(1,a), A,B) 

但它沒有工作。

回答

3

cellfun預計單元陣列作爲函數的輸入。你有一個數值數組,所以用arrayfun來代替。您也不會輸出數組中的每個元素的標量,因此您需要將UniformOutput標誌設置爲0.最後,使用colon運算符來執行所需的操作,而不是矩陣乘法。輸出將不幸成爲細胞的行向量,所以如果你確實需要的列向量如您在您的文章顯示什麼,轉輸出:

A = [5 3 8 7 0 4 1]; 
B = 10; 
C = arrayfun(@(x) B*(1:x), A, 'UniformOutput', 0).'; 

,請注意該匿名函數聲明爲第一輸入到arrayfun具有詞法範圍,這意味着在匿名函數聲明之前在工作區中可見的任何變量都是可見的。您可以在函數內部訪問該變量,而不必將其作爲單獨的輸入手動輸入到arrayfun中。

現在,我們得到:

>> format compact 
>> celldisp(C) 
C{1} = 
    10 20 30 40 50 
C{2} = 
    10 20 30 
C{3} = 
    10 20 30 40 50 60 70 80 
C{4} = 
    10 20 30 40 50 60 70 
C{5} = 
    [] 
C{6} = 
    10 20 30 40 
C{7} = 
    10 
+0

您好我忘了說,我想,太...它說類型「細胞」的輸入參數'未定義功能「冒號」。 @(x)B *(1:x)的錯誤' – PhoenixBlue

+0

@PhoenixBlue'cellfun'需要一個**單元陣列**。請詳細閱讀我的帖子。你會注意到**我沒有使用'cellfun' **。 – rayryeng

+0

OH!對不起這是我的錯!有效!我只是把單元格數組,而不是簡單的數組(甚至在我的第一次嘗試...)!再次感謝!! – PhoenixBlue