如何初始化具有特定值的矩阵的所有条目?

时间:2011-02-07 06:57:54

标签: arrays matlab

Haskell中,如果我想获得一个只包含数字5的10元素列表,我可以这样做:

take 10 $ repeat 5

输出:

[5,5,5,5,5,5,5,5,5,5]

Matlab中有这样的东西吗?

5 个答案:

答案 0 :(得分:65)

很容易为数组指定重复值:

x(1:10) = 5;

如果要在语句中内联生成元素数组,请尝试以下方法:

ones(1,10) * 5

repmat

repmat(5, 1, 10)

答案 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 2017a100000次迭代下执行。获胜者是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.
相关问题