使用相同的数字初始化MxN矩阵

1813次浏览(最近30天)
萨尔瓦托雷·马扎里诺
萨尔瓦托雷·马扎里诺 2012年10月20日
编辑: Rik 2020年6月19日
我将用相同的数字初始化一个M x N矩阵。就速度而言,哪种可能是最好的方式?
锿。
[2 2;
2 2
2 2]

答复(9)

马特无花果
马特无花果 2012年10月20日
另一个问题:
做一个3 × 8的9的矩阵:
(1:3, 1:8) = 9
3评论
沃尔特·罗伯森
沃尔特·罗伯森 2016年9月29日
? 你在和一个4年前的帖子争论?
1月 举一个反例:
A=兰特(9);
A(1:3,1:8)=9;
A.
A=
9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 0.9651
9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 9.0000
9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 9.0000 0.7577
0.5009 0.5300 0.3514 0.0230 0.6206 0.5925 0.8718 0.5488 0.7359
0.8410 0.9315 0.2206 0.2301 0.4299 0.1449 0.7987 0.3064 0.6590
0.9057 0.9739 0.3609 0.8522 0.6744 0.5350 0.7201 0.2121 0.9933
0.2481 0.8476 0.1054 0.9497 0.9710 0.2542 0.0973 0.6881 0.8679
0.1017 0.7075 0.1900 0.1831 0.3252 0.8435 0.3257 0.7090 0.4237
0.5273 0.9981 0.1697 0.2163 0.9954 0.9812 0.1355 0.4648 0.6465
部分数组被设置为需要的,而其余的没有被设置,不符合规范。

登录评论。


弗里德里希
弗里德里希 2018年8月14日
编辑:弗里德里希 2018年8月15日
我知道这是旧的,但我不能让它走。我发现
一个= 0 (M, N) + 10;
成为最快的。至少在我的电脑上。这里是我的代码测试和结果在Matlab 2017b
%产生6.4GB的数据
M=80e6;
N = 10;
清楚的A.
抽搐;
一个= 1 (M, N) * 10;
disp([“A=一(M,N)*10;=”num2str(toc)'s']);
清楚的A.
抽搐;
一个= uninit (M, N);
A(:)=10;
disp(['A=未校准(M,N);A(:)=10;='num2str(toc)'s']);
清楚的A.
抽搐;
一个= repmat (10 (M, N));
disp(['A=repmat(10[M,N]);'num2str(toc)'s']);
清楚的A.
抽搐;
A=零(0,M,N)+10;
disp(['A=mxFastZeros(0,M,N)+10;='num2str(toc)'s']);
清楚的A.
抽搐;
一个= 0 (M, N) + 10;
disp(['A=零(M,N)+10;='num2str(toc)'s']);
清楚的A.
抽搐;
一个= 12;
A=A(一(M,N));
disp([“a=10;a=a(一(M,N));=”num2str(toc)'s']);
清楚的A.
后果
一个= 1 (M, N) * 10;= 3.312年代
一个= uninit (M, N);(:) = 10;= 2.508年代
一个= repmat (10 (M, N));= 2.1169年代
一个= mxFastZeros (0, M, N) + 10;= 1.8326年代
A=0(M,N)+10;=1.8487s
10 =, = ((M, N));= 25.0576年代
编辑:感谢James对mxFastZeros的提示。我把它包含在基准测试中。
5个评论
Rik
Rik 2020年6月18日
我还添加了您的建议 兰迪 并将其作为一个答案重新发布,以避免被掩埋。

登录评论。


Azzi Abdelmalek
Azzi Abdelmalek 2012年10月20日
编辑:Azzi Abdelmalek 2012年10月20日
= 0 (M, N)
4评论

登录评论。


Rik
Rik 2020年6月18日
编辑:Rik 2020年6月19日
受以下答案中的比较速度测试启发: 弗里德里希 ,我扩展了他的代码,使其能够在多个不同版本上执行更健壮的测试。下面的计时标准化为 10 * 1 (M, N) ,以及倍频程和ML6.5具有较少的元素,以防止出现最大阵列大小错误。有关所有详细信息,请参阅附件。
你可以让这个功能更花哨,但我不想花时间在这上面。我可能会在某个点更新这个函数)
Matlab 6.5:
一个= 1 (M, N) * 10;= 0.0410s(标准化时间= 0.99)
A=零(M,N)+10;=0.0400s(标准化时间=1.01)
A=repmat(10[M,N])=0.0460s(标准化时间=1.14)
a=10;A=A(一(M,N));=0.2770s(标准化时间=6.84)
R2011a:
A=repmat(10,[M,N]) = 1.8918s(标准化时间= 0.98)
一个= 1 (M, N) * 10;= 1.8975s(归一化时间= 0.99)
A=uninit(M,N);A(:)=10;=1.9129s(标准化时间=1.00)
A=零(M,N)+10;=2.0259s(标准化时间=1.05)
A=mxFastZeros(0,M,N)+10;=3.7976s(标准化时间=1.94)
a=10;a=a(一(M,N));=8.4049s(标准化时间=4.36)
A=randi([10,10],M,N);=12.0829s(标准化时间=6.20)
R2015a:
A=repmat(10,[M,N]) = 0.6856s(标准化时间= 0.39)
一个= repelem (10, M, N);= 0.7803s(标准化时间= 0.44)
A=mxFastZeros(0,M,N)+10;=1.7123s(标准化时间=0.97)
一个= uninit (M, N);(:) = 10;= 1.7477s(归一化时间= 0.99)
一个= 1 (M, N) * 10;= 1.7598s(归一化时间= 0.99)
A=0(M,N)+10;=1.8429s(标准化时间=1.04)
a=10;A=A(一(M,N));=7.6893s(标准化时间=4.35)
randi = ((10,10), M, N);= 7.7680s(归一化时间= 4.40)
R2020a:
A=mxFastZeros(0,M,N)+10;=0.6672s(标准化时间=0.31)
一个= 0 (M, N) + 10;= 0.6879s(标准化时间= 0.31)
A=repmat(10[M,N])=0.7013s(标准化时间=0.32)
一个= repelem (10, M, N);= 0.7761s(标准化时间= 0.36)
A=未校准(M,N);A(:)=10;=1.7886s(标准化时间=0.83)
A=一(M,N)*10;=2.1304s(标准化时间=0.98)
A=randi([10,10],M,N);=6.9900s(标准化时间=3.21)
10 =, = ((M, N));= 7.2315s(标准化时间= 3.32)
倍频程5.2.0
A=repmat(10[M,N])=0.0264s(标准化时间=0.43)
A=重复(10,M,N);=0.0366s(标准化时间=0.59)
A=零(M,N)+10;=0.0583s(标准化时间=0.94)
A=uninit(M,N);A(:)=10;=0.0628s(标准化时间=1.00)
A=一(M,N)*10;=0.0637秒(标准化时间=1.03)
10 =, = ((M, N));= 0.0945s(归一化时间= 1.53)
randi = ((10,10), M, N);= 0.4947s(标准化时间= 8.00)
3评论
詹姆斯·图尔萨
詹姆斯·图尔萨 2020年6月18日
看起来他们已经向这些非官方函数公开了真正的接口。就用它们吧。例如。,
mxArray*mxFastZeros(int cmplx_flag, int m, int n);
mxArray*mxCreateSharedDataCopy(常量mxArray*mx);

登录评论。


1月
1月 2012年10月20日
为了避免前面的定义带来麻烦,我倾向于:
A=repmat(12,M,N);
调用m文件的开销 雷普马特 可以省略:
一个= 12;
A=A(一(M,N));

马特·J
马特·J 2012年10月20日
一个= 0 (M, N);
(,) = some_number;

詹姆斯·图尔萨
詹姆斯·图尔萨 2012年10月20日
编辑:詹姆斯·图尔萨 2012年10月20日
如果尚未分配矩阵A,另一种方法是:
A=未校准(M,N);
A(:)=某个数字;
可在以下位置找到:
如果矩阵A是预先存在的,那么当然跳过分配步骤,只需填写上面第二行的值。
附注:在后来的MATLAB版本中,解析器似乎足够聪明,能够识别*ones(m,n)公式,而不是实际做乘法。至少这是我基于速度测试得出的结论。

MathWorks支万博1manbetx持团队
通常,使用相同数字初始化矩阵的最简单方法如下所示,即生成一个元素均为2的3×2矩阵:
= 2 * 1 (2)
A = 0 (3,2) + 2
A=repmat(2,3,2)
这些方法的相对速度取决于您的计算环境。

马特·J
马特·J 2018年11月11日
这是一艘安全的单程客轮,但我不知道它有多快。
A=随机数([n,n],M,n);

标签

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始打猎吧!