首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MATLAB中创建一个由一个数字组成的数组的优雅方法?

在MATLAB中创建一个由一个数字组成的数组的优雅方法?
EN

Stack Overflow用户
提问于 2014-11-03 12:11:27
回答 3查看 164关注 0票数 3

我知道要得到10个0,一个人可以做到。

代码语言:javascript
复制
A = zeros(10, 1);

要得到10个1,一个人可以做到。

代码语言:javascript
复制
A = ones(10, 1);

任意的数字呢?比方说,我想要10 3。我想出了一种方法。

代码语言:javascript
复制
A = linspace(3, 3, 10);

这样满意吗?有什么更优雅的方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-03 12:18:09

一些替代办法:

  • 使用repmat: A= repmat(3,5 7);填充值3的%// 5x7矩阵
  • 使用索引: A(1:m,1:n) = x;

下面是所有建议的方法之间的时序比较。正如您所看到的,@Dennis' solutions 是最快的(至少在我的系统上)。

功能:

代码语言:javascript
复制
function y = f1(x,m,n) %// Dennis' "ones"
y = x*ones(m,n);

function y = f2(x,m,n) %// Dennis' "zeros"
y = x+zeros(m,n);

function y = f3(x,m,n) %// Luis' "repmat"
y = repmat(x,[m n]);

function y = f4(x,m,n) %// Luis' "dirty"
y(m,n) = 0;
y(:) = x;

function y = f5(x,m,n) %// Luis' "indexing"
y(1:m,1:n) = x;

function y = f6(x,m,n) %// Divakar's "matrix porod"
y = x*ones(m,1)*ones(1,n);

正方形数组的基准脚本:

代码语言:javascript
复制
x = 3;
sizes = round(logspace(1,3.7,10)); %// max limited by computer memory
for s = 1:numel(sizes)
    n = sizes(s);
    m = sizes(s);
    time_f1(s) = timeit(@() f1(x,m,n));
    time_f2(s) = timeit(@() f2(x,m,n));
    time_f3(s) = timeit(@() f3(x,m,n));
    time_f4(s) = timeit(@() f4(x,m,n));
    time_f5(s) = timeit(@() f5(x,m,n));
    time_f6(s) = timeit(@() f6(x,m,n));
end
loglog(sizes, time_f1, 'r.-');
hold on
loglog(sizes, time_f2, 'g.:');
loglog(sizes, time_f3, 'b.-');
loglog(sizes, time_f4, 'm.-');
loglog(sizes, time_f5, 'c.:');
loglog(sizes, time_f6, 'k.:');
xlabel('Array size')
ylabel('Time')
legend('ones', 'zeros', 'repmat', 'dirty', 'indexing', 'matrix prod')

对于列数组:只需更改以下行:

代码语言:javascript
复制
sizes = round(logspace(1,3.7,10)).^2; %// max limited by computer memory
n = 1;
m = sizes(s);

对于行数组:

代码语言:javascript
复制
sizes = round(logspace(1,3.7,10)).^2; %// max limited by computer memory
n = sizes(s);
m = 1;

结果为双核CPU,2-GB内存,Windows,Matlab R2010b:

  1. 方阵;
  2. 列阵列;
  3. 行数组。

票数 12
EN

Stack Overflow用户

发布于 2014-11-03 12:17:14

有两种基本方法可以做到这一点:

代码语言:javascript
复制
A = ones(10,1)*3
B = zeros(10,1)+3

第一种是最常用的例子,但如果我没有弄错,第二种则略好一些。总之,这只是品味的问题。

当然,如果您有一个现有的矩阵,还有一种简单的方法:

代码语言:javascript
复制
C = zeros(10,1)
C(:) = 3;

为了完整起见,@Luis建议的爬行动物解决方案也很好。

票数 7
EN

Stack Overflow用户

发布于 2014-11-03 13:52:05

作为另一种选择,基于matrix multiplication的方法(在MATLAB上被认为是相当快的)也可以用于2Dmultidimensional array的分配工作。

因此,假设mrowsncolumnsx为所有元素的赋值,代码为-

代码语言:javascript
复制
y = x*ones(m,1)*ones(1,n);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26714067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档