細胞

2017-01-04 184 views
2

我現在的任務是要構造一個細胞C其中含有第一尺寸包含在載體中細胞

n = [12 23 54]矩陣。

雖然他們的第二尺寸是固定與

r = 3

所以,我想細胞C = {rand(12,3), rand(23,3), rand(54,3)}.

我知道for-loop可以成爲我的目的是:

C=cell(3,1) % pre-allocation 

for i = 1 : length(n) 
    C{i} = rand(n(i),r); 
end 

我想知道如果我能更聰明做到這一點,而不使用在Matlab一個for loop?謝謝

回答

1

有真的在這個特定的情況下使用for環(在這裏,唯一的選擇是cellfunarrayfun大多數情況下)as it is easier for MATLAB's JIT compiler to handle沒有壞處,但如果你真的不願意for循環,您可以使用arrayfun在非統一的輸出內結合起來,給你想要的結果。

C = arrayfun(@(x)rand(x, r), n, 'UniformOutput', false); 

這實際上可能比for循環爲上述原因較慢。但是,嘿,這是一條線,所以這是重要的!

+0

非常感謝你和你對'arrayfun'命令的介紹。 – nam

+0

「使用'for'循環無損害」是一個非常籠統的陳述。在這種情況下(單元陣列)沒有壞處。在其他情況下,如數值數組計算,那麼有一些*特殊情況,對循環來說只有微小的懲罰,但通常有很大的優勢來避免它們。 – jez

+0

@jez相信我我很清楚。我認爲,自從我回答一個*特定的問題以來,可以推斷出這個評論直接關係到當前的問題。 – Suever

1

forwhile甚至在Matlab中也有它們的位置。您可能被告知要避開它們,因爲在遍歷壓縮數值數組的行,列或其他維時,向量化操作速度會更快。但是對於更高層次的構造,如單元陣列,通常沒有任何優勢(以及可讀性懲罰)來嘗試在純粹的準矢量化語句中完成所有事情。您現有的解決方案可能是最好的方法。

1

較短的替代,只是爲了好玩:

C = mat2cell(rand(sum(n),r), n,r)'; 

但一個普通的循環幾乎肯定是最快的在這種情況下,因爲mat2cell使用一個循環,以及其豐富的輸入檢查。