【问题标题】:Construct cell which contains different sizes of matrices of different dimension构建包含不同大小的不同维度矩阵的单元格
【发布时间】:2017-01-04 15:22:57
【问题描述】:

我现在的任务是构建一个单元格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 的情况下做得更聪明吗?谢谢

【问题讨论】:

    标签: matlab matrix cell


    【解决方案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 循环慢。但是,嘿,这是一条线,所以这很重要!

    【讨论】:

    • 非常感谢您为我介绍arrayfun 命令。
    • “使用for 循环没有害处”是一个非常笼统的陈述。在这种情况下(单元格数组)没有害处。在其他情况下,例如数值数组计算,则有 少数 种特殊情况,for 循环只有边际损失,但通常避免它们有很大优势。
    • @jez 相信我,我很清楚。我假设由于我回答的是特定问题,因此可以推断此评论直接与手头的问题有关。
    • @jez ...同样过于笼统的陈述:)你能提供一个例子来支持它吗?您使用的是哪个 MATLAB 版本?因为自 R2015a 以来,JIT 在循环性能方面有了相当显着的改进。这些天来,我建议反对for 的案例越来越少,所以我很想了解你的情况。
    • @jez 对于arrayfun 和cellfun,当您使用简单的for 时,总会有所改进,至少在Matlab 2015a 中是更新的。
    【解决方案2】:

    for 和 while 循环有它们的位置,即使在 Matlab 中也是如此。您可能被告知要避免使用它们,因为当您迭代压缩数字数组的行、列或其他维度时,矢量化操作要快得多。但是对于像元胞数组这样的更高级别的构造,尝试在简洁的准向量化语句中完成所有事情通常没有优势(并且会降低可读性)。您现有的解决方案可能是最好的方法。

    【讨论】:

      【解决方案3】:

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

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

      但是在这种情况下,一个普通的循环几乎可以肯定是最快的,因为mat2cell 使用一个循环,以及对其输入的大量检查。

      【讨论】:

        猜你喜欢
        • 2020-05-22
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 2013-08-15
        相关资源
        最近更新 更多