我现在的任务是构造一个单元格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的情况下更聪明地完成这个任务吗?谢谢
发布于 2017-01-04 15:24:47
在这个特定的场景中使用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循环慢。但是,嘿,这是一条线,所以这才是最重要的!
发布于 2017-01-04 15:53:24
for和while循环有各自的位置,即使在Matlab中也是如此。您可能被告知要避免这些操作,因为矢量化操作在遍历打包数字数组的行、列或其他维度时要快得多。但是,对于像单元数组这样的更高级别的构造,尝试以整洁的准矢量化语句来做事情通常没有优势(以及可读性的损失)。您现有的解决方案可能是最好的方法。
发布于 2017-01-04 16:02:32
一种更短的选择,只是为了好玩:
C = mat2cell(rand(sum(n),r), n,r)';但是在这种情况下,普通循环几乎肯定是最快的,因为mat2cell使用一个循环,以及对它的输入进行大量检查。
https://stackoverflow.com/questions/41467313
复制相似问题