构造包含不同尺寸的不同尺寸矩阵的单元格

时间:2017-01-04 15:22:58

标签: matlab matrix cell

我现在的任务是构建一个单元格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,我是否可以更聪明地做到这一点?谢谢

3 个答案:

答案 0 :(得分:1)

在此特定方案中使用for循环确实没有坏处(在大多数情况下,唯一的选择是cellfunarrayfunas it is easier for MATLAB's JIT compiler to handle,但是你真的厌恶for循环,你可以在非均匀输出中使用arrayfun来提供你想要的结果。

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

由于上述原因,这实际上可能比for循环更慢。但是,嘿,这是一条线,所以这一切都很重要!

答案 1 :(得分:1)

即使在Matlab中,

forwhile循环也有它们的位置。您可能已被告知要避免使用它们,因为当您迭代打包数字数组的行,列或其他维度时,矢量化操作会更快。但是对于更高级别的构造,如单元格数组,在整齐的准矢量化语句中尝试执行所有操作通常没有任何优势(以及可读性惩罚)。您现有的解决方案可能是最好的方法。

答案 2 :(得分:1)

更短的选择,只是为了好玩:

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

但是在这种情况下,一个简单的循环几乎肯定是最快的,因为mat2cell使用循环,并对其输入进行大量检查。