我现在的任务是构建一个单元格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
,我是否可以更聪明地做到这一点?谢谢
答案 0 :(得分:1)
在此特定方案中使用for
循环确实没有坏处(在大多数情况下,唯一的选择是cellfun
或arrayfun
)as it is easier for MATLAB's JIT compiler to handle,但是你真的厌恶for循环,你可以在非均匀输出中使用arrayfun
来提供你想要的结果。
C = arrayfun(@(x)rand(x, r), n, 'UniformOutput', false);
由于上述原因,这实际上可能比for循环更慢。但是,嘿,这是一条线,所以这一切都很重要!
答案 1 :(得分:1)
for
和while
循环也有它们的位置。您可能已被告知要避免使用它们,因为当您迭代打包数字数组的行,列或其他维度时,矢量化操作会更快。但是对于更高级别的构造,如单元格数组,在整齐的准矢量化语句中尝试执行所有操作通常没有任何优势(以及可读性惩罚)。您现有的解决方案可能是最好的方法。
答案 2 :(得分:1)
更短的选择,只是为了好玩:
C = mat2cell(rand(sum(n),r), n,r)';
但是在这种情况下,一个简单的循环几乎肯定是最快的,因为mat2cell
使用循环,并对其输入进行大量检查。