没想到吧,用了几年MATLAB我也是才发现……
以前也没在意,今天偶然机会要处理一个超大的数据,为了优化就测了一下。
结果重大发现!想象中完全一样的代码,实际耗时却有明显差别。
测试代码
clear; close all; clc
N = 1000000;
a = zeros(N,5);
% 冒号
tic
for n = 1:N
a(n,:) = [1,2,3,4,5];
end
toc
% 索引
tic
for n = 1:N
a(n,1:5) = [1,2,3,4,5];
end
toc
% 单个
tic
for n = 1:N
a(n,1) = 1;
a(n,2) = 2;
a(n,3) = 3;
a(n,4) = 4;
a(n,5) = 5;
end
toc
测试时间
三种写法耗时为别为0.07,0.51,0.125
结论
- 优先选择冒号全覆盖
- 不行就单个复制
- 对速度无要求的时候直接索引
其他
1、原因大概是 MATLAB矩阵底层原理和编译不同。
2、c语言大佬可能知道。