相关疑难解决方法(0)

arrayfun可能比matlab中的显式循环慢得多.为什么?

考虑以下简单的速度测试arrayfun:

T = 4000;
N = 500;
x = randn(T, N);
Func1 = @(a) (3*a^2 + 2*a - 1);

tic
Soln1 = ones(T, N);
for t = 1:T
    for n = 1:N
        Soln1(t, n) = Func1(x(t, n));
    end
end
toc

tic
Soln2 = arrayfun(Func1, x);
toc
Run Code Online (Sandbox Code Playgroud)

在我的机器上(Linux Mint 12上的Matlab 2011b),该测试的输出是:

Elapsed time is 1.020689 seconds.
Elapsed time is 9.248388 seconds.
Run Code Online (Sandbox Code Playgroud)

什么了?!?arrayfun虽然公认的解决方案更清洁,但速度要慢一个数量级.这里发生了什么?

此外,我做了类似的测试方式cellfun,发现它比显式循环慢约3倍.同样,这个结果与我的预期相反.

我的问题是:为什么是arrayfuncellfun这么多慢?鉴于此,有没有充分的理由使用它们(除了使代码看起来很好)?

注意:我说的是arrayfun这里的标准版本,而不是并行处理工具箱中的GPU版本.

编辑:为了清楚起见,我知道 …

arrays performance matlab

103
推荐指数
1
解决办法
2万
查看次数

计算两个多维数组之间的相关系数

我有两个具有形状N X T和数组的阵列M X T.我想计算T每对可能的行nm(分别来自NM)之间的相关系数.

什么是最快,最pythonic的方式来做到这一点?(循环过来N,M在我看来既不快也不是pythonic.)我期待答案涉及numpy和/或scipy.现在我的数组是numpy arrays,但我愿意将它们转换为不同的类型.

我期待我的输出是一个形状的数组N X M.

NB当我说"相关系数"时,我的意思是Pearson乘积矩相关系数.

以下是一些需要注意的事项:

  • numpy函数correlate要求输入数组为一维.
  • numpy函数corrcoef接受二维数组,但它们必须具有相同的形状.
  • scipy.stats函数pearsonr要求输入数组为一维.

python arrays numpy scipy correlation

22
推荐指数
2
解决办法
3万
查看次数

标签 统计

arrays ×2

correlation ×1

matlab ×1

numpy ×1

performance ×1

python ×1

scipy ×1