相关疑难解决方法(0)

A == 0真的比~A好吗?

问题设置简介

我在做一些涉及基准- ~AA==0double array with no NaNs,两者都转换A为逻辑阵列,所有zeros被转换为true值和休息被设置为false值.

对于基准测试,我使用了三组输入数据 -

  • 从小到小的数据 - 15:5:100
  • 中小型数据 - 50:40:1000
  • 中型到大型数据 - 200:400:3800

输入是使用A = round(rand(N)*20),其中N是从size数组中获取的参数.因此,N会从变化15 to 100 with stepsize of 5为所述第一组和类似地对于第二和第三组.请注意,我将datasize定义为N,因此元素的数量将是datasize ^ 2或N ^ 2.

基准代码

N_arr = 15:5:100; %// for very small to small sized input array
N_arr = 50:40:1000; %// for small to medium sized input array
N_arr = 200:400:3800; %// for medium …
Run Code Online (Sandbox Code Playgroud)

arrays performance benchmarking matlab logical-operators

25
推荐指数
1
解决办法
771
查看次数

MATLAB函数第一次运行缓慢,但随后更快.为什么?

我有一个很大的MATLAB函数文件.它首先创建一个零矩阵,然后通过评估函数中硬编码的多个相应(长)代数表达式来更新大约70%的单元格.完成后,将返回一个数字矩阵.

.m文件大约4 MB(我有100个这样的m.文件,但这不是直接相关的).当我第一次评估该功能时,需要大约9秒来评估.然而,后续运行只需要大约0.1秒,这正是我所期待的.

为什么第一次评估需要9秒钟?每当我关闭并重新打开MATLAB时,我每次都会进行这种缓慢的第一次评估,后续运行速度要快得多.为什么是这样?

米 文件可以在以下公共链接中找到(您可以从浏览器中复制文本):https: //dl.dropboxusercontent.com/u/157153767/K_a_12_102x.m

您应该使用的命令窗口输入是:[test] = K_a_12_102x(414000000,1.1095e + 09,1.2500e-04,0.0840,0.0840,0.0240,0.0240,0.0020,0.0020,0,0,0,0,3.0397e + 08,8.9930e + 07,0,3.0397e + 08,0,1.0702e + 08,0,0,0,0,0,0,497.7389,80.7355,-15.9811,391.1985,-15.9811,103.5248,20440000,0,20440000 ,0.06)

benchmarking matlab

7
推荐指数
2
解决办法
2198
查看次数

循环语句性能并预先分配循环语句本身

这种观察并不重要,因为浪费在循环语句上的时间性能可能远高于循环本身.但无论如何,我会分享它,因为我搜索并找不到关于此的话题.我总是有这样的印象:预先分配我将循环的数组,然后循环它,将比直接循环它更好,并决定检查它.代码将比较这两个fors之间的效率:

disp('Pure for with column on statement:')
tic
for k=1:N
end
toc

disp('Pure for with column declared before statement:')
tic
m=1:N;
for k=m
end
toc
Run Code Online (Sandbox Code Playgroud)

但我得到的结果是:

Pure for with column on statement:
Elapsed time is 0.003309 seconds.
Pure for with column declared before statement:
Elapsed time is 0.208744 seconds.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?不应该预先分配更快?

事实上,matlab help for说:

因为从不创建索引向量,所以当结束表达式出现在FOR语句中时,长循环可以提高内存效率.

因此,与我的期望相反,for语句中的列表达式更好,因为它不分配向量,因此更快.

我做了以下脚本来测试其他场合我也认为会更快:

% For comparison:
N=1000000;

disp('Pure for loop on cell declared on statement:')
tic
for k=repmat({1},1,N)
end
toc

disp('Pure for loop on …
Run Code Online (Sandbox Code Playgroud)

matlab for-loop while-loop

5
推荐指数
1
解决办法
201
查看次数