在Haskell中,如果我想获得一个只包含数字5的10元素列表,我可以这样做:
take 10 $ repeat 5
输出:
[5,5,5,5,5,5,5,5,5,5]
Matlab中有这样的东西吗?
答案 0 :(得分:65)
答案 1 :(得分:22)
one方法比使用repmat快得多:
>> tic; for i = 1:1e6, x=5*ones(10,1); end; toc
Elapsed time is 3.426347 seconds.
>> tic; for i = 1:1e6, y=repmat(5,10,1); end; toc
Elapsed time is 20.603680 seconds.
而且,在我看来,代码更具可读性。
答案 2 :(得分:5)
请参阅文档中的repmat。
B = repmat(5,1,10)
答案 3 :(得分:5)
在您的示例中,给定预定义的m-by-n
矩阵大小和目标值val
:
m = 1;
n = 10;
val = 5;
目前我想到了7
种不同的方法:
1)使用repmat功能 (0.094066秒)
A = repmat(val,m,n)
2)使用分配对未定义矩阵进行索引 (0.091561秒)
A(1:m,1:n) = val
3)使用ones函数 (0.151357秒)对目标值建立索引
A = val(ones(m,n))
4)完全分配的默认初始化 (0.104292秒)
A = zeros(m,n);
A(:) = val
5)使用带乘法的ones函数 (0.069601秒)
A = ones(m,n) * val
6)使用zeros功能添加 (0.057883秒)
A = zeros(m,n) + val
7)使用repelem功能 (0.168396秒)
A = repelem(val,m,n)
在每种方法的描述之后,在括号之间,其相应的基准在Matlab 2017a
和100000
次迭代下执行。获胜者是6th
方法,这并不让我感到惊讶。
解释很简单:分配通常会产生零填充的内存槽...因此除了向矩阵的每个成员添加val
之外,不执行任何其他操作,并且最重要的是,输入消毒的论点非常短暂。
同样不能说5th
方法,这是第二快的方法,因为尽管输入参数清理过程基本相同,但在内存方面正在执行三个操作而不是两个:
1
val
答案 4 :(得分:0)
如其他答案中所述,您可以使用:
>> tic; x=5*ones(10,1); toc
Elapsed time is 0.000415 seconds.
更快的方法是:
>> tic; x=5; x=x(ones(10,1)); toc
Elapsed time is 0.000257 seconds.