相关疑难解决方法(0)

通过空矩阵乘法更快地初始化数组的方法?(Matlab的)

我偶然发现了Matlab处理空矩阵的奇怪方式(在我看来).例如,如果两个空矩阵相乘,则结果为:

zeros(3,0)*zeros(0,3)
ans =

 0     0     0
 0     0     0
 0     0     0
Run Code Online (Sandbox Code Playgroud)

现在,这已经让我感到惊讶,然而,快速搜索让我进入上面的链接,我得到了解释为什么会发生这种情况的一些扭曲的逻辑.

但是,没有任何事情让我为以下观察做好准备 我问自己,这种类型的乘法与使用zeros(n)函数的效率有多高,比如初始化的目的?我以前timeit回答这个问题:

f=@() zeros(1000)
timeit(f)
ans =
    0.0033
Run Code Online (Sandbox Code Playgroud)

VS:

g=@() zeros(1000,0)*zeros(0,1000)
timeit(g)
ans =
    9.2048e-06
Run Code Online (Sandbox Code Playgroud)

两者都有1000x1000类零的矩阵相同的结果double,但空矩阵乘法1的速度快〜350倍!(使用ticand toc和循环发生类似的结果)

怎么会这样?是timeit或是tic,toc虚张声势还是我找到了一种更快速的方法来初始化矩阵?(这是用matlab 2012a完成的,在win7-64机器上,intel-i5 650 3.2Ghz ...)

编辑:

在阅读了您的反馈之后,我更仔细地研究了这个特性,并在2台不同的计算机上进行了测试(同样的matlab ver,尽管2012a),这是一个检查运行时间与矩阵n大小的代码.这就是我得到的:

在此输入图像描述

生成此代码的代码与timeit之前一样使用,但循环使用tic并且toc看起来相同.因此,对于小尺寸,zeros(n)是可比的.然而,围绕n=400空矩阵乘法的性能有所提升.我用来生成该图的代码是:

n=unique(round(logspace(0,4,200)));
for k=1:length(n)
    f=@() zeros(n(k));
    t1(k)=timeit(f);

    g=@() zeros(n(k),0)*zeros(0,n(k));
    t2(k)=timeit(g);
end

loglog(n,t1,'b',n,t2,'r');
legend('zeros(n)','zeros(n,0)*zeros(0,n)',2);
xlabel('matrix size …
Run Code Online (Sandbox Code Playgroud)

performance matlab initialization matrix-multiplication

62
推荐指数
3
解决办法
4750
查看次数

BSXFUN关于关系操作的内存效率

我想在这里研究两件事 -

  • 有六种内置与使用关系操作bsxfun:@eq (equal),@ne (not-equal),@lt (less-than),@le (less-than or equal),@gt (greater-than)@ge (greater-than or equal).很多时候我们在浮点数上使用它们并进行关系操作,它们输出逻辑数组.所以,让我很好奇,如果bsxfun在浮点数上使用这些关系运算时的固有扩展涉及输入元素的实际复制,这正是我的第一个问题.

  • 我还想知道这个内存效率问题如何转换为何anonymous functions时使用bsxfun,再次与关系操作的情况一起使用.

这是受到的runtime/speedup测试的启发Comparing BSXFUN and REPMAT.

memory matlab memory-management vectorization bsxfun

6
推荐指数
1
解决办法
457
查看次数