标签: vectorization

为什么矢量化代码比MATLAB中的循环运行得更快?

我读过这篇文章,但我仍然不明白为什么矢量化代码更快.

在for循环中,我可以使用parfor进行并行计算.如果矢量化代码更快,是否意味着它会自动并行化?

parallel-processing matlab for-loop vectorization

23
推荐指数
2
解决办法
7672
查看次数

为什么外部工作不像我认为的那样(在R中)?

@ hadley 在今天的答案中引用关于功能文章提示,我决定重新审视一个关于outer函数如何工作(或不工作)的持久性谜题.为什么会失败:

outer(0:5, 0:6, sum) # while outer(0:5, 0:6, "+") succeeds
Run Code Online (Sandbox Code Playgroud)

这显示了我认为outer 应该如何处理如下函数sum:

 Outer <- function(x,y,fun) {
   mat <- matrix(NA, length(x), length(y))
   for (i in seq_along(x)) {
            for (j in seq_along(y)) {mat[i,j] <- fun(x[i],y[j])} }
   mat}

>  Outer(0:5, 0:6, `+`)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    0    1    2    3    4    5    6
[2,]    1    2    3    4    5    6    7
[3,]    2    3    4    5 …
Run Code Online (Sandbox Code Playgroud)

functional-programming r vectorization

23
推荐指数
1
解决办法
2592
查看次数

在pandas数据帧中向量化条件赋值

如果我有一个带有列x的数据帧df,并希望在伪代码中使用此值基于x的值创建列y

 if df['x'] <-2 then df['y'] = 1 
 else if df['x'] > 2 then df['y']= -1 
 else df['y'] = 0
Run Code Online (Sandbox Code Playgroud)

我将如何实现这一目标.我认为np.where是最好的方法,但不知道如何正确编码.

python numpy vectorization pandas

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

Python Pandas:Series的"Reduce"功能

是否有适用reduce于熊猫系列的模拟?

例如,对于模拟mappd.Series.apply,但我无法找到任何模拟reduce.


我的申请是,我有一个大熊猫系列清单:

>>> business["categories"].head()

0                      ['Doctors', 'Health & Medical']
1                                        ['Nightlife']
2                 ['Active Life', 'Mini Golf', 'Golf']
3    ['Shopping', 'Home Services', 'Internet Servic...
4    ['Bars', 'American (New)', 'Nightlife', 'Loung...
Name: categories, dtype: object
Run Code Online (Sandbox Code Playgroud)

我想将这些系列列表合并在一起使用reduce,如下所示:

categories = reduce(lambda l1, l2: l1 + l2, categories)
Run Code Online (Sandbox Code Playgroud)

但这需要花费可怕的时间,因为将两个列表合并在一起就是O(n)Python的时间.我希望pd.Series有一种矢量化的方式来更快地执行此操作.

python performance reduce vectorization pandas

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

python numpy ndarray元素明智的意思

我想计算numpy ndarray的元素平均值.

In [56]: a = np.array([10, 20, 30])

In [57]: b = np.array([30, 20, 20])

In [58]: c = np.array([50, 20, 40])
Run Code Online (Sandbox Code Playgroud)

我想要的是:

[30, 20, 30]
Run Code Online (Sandbox Code Playgroud)

除了矢量化和和除以外,是否有任何内置函数用于此操作?

python numpy vectorization

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

矢量化依赖于先前元素的产品计算?

我正在尝试加速/矢量化时间序列中的一些计算.我可以在for循环中矢量化计算,这可能取决于早期迭代的结果吗?例如:

z <- c(1,1,0,0,0,0)
zi <- 2:6
for  (i in zi) {z[i] <- ifelse (z[i-1]== 1, 1, 0) }
Run Code Online (Sandbox Code Playgroud)

使用前面步骤中更新的z [i]值:

> z
[1] 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

在我的努力中矢量化这个

z <- c(1,1,0,0,0,0)
z[zi] <- ifelse( z[zi-1] == 1, 1, 0)
Run Code Online (Sandbox Code Playgroud)

逐个元素的操作不使用操作中更新的结果:

> z
[1] 1 1 1 0 0 0
Run Code Online (Sandbox Code Playgroud)

因此,这种向量化操作以"并行"而非迭代方式运行.有没有办法我可以写/向量化这个来获得for循环的结果?

product r vectorization

20
推荐指数
3
解决办法
3003
查看次数

怎样才能让gccgo产生矢量化代码?

我试图说服gccgo没有成功矢量化以下片段:

package foo

func Sum(v []float32) float32 {
    var sum float32 = 0
    for _, x := range v {
        sum += x
    }
    return sum
} 
Run Code Online (Sandbox Code Playgroud)

我正在验证由以下内容生成的程序集:

$ gccgo -O3 -ffast-math -march=native -S test.go
Run Code Online (Sandbox Code Playgroud)

gccgo版本是:

$ gccgo --version
gccgo (Ubuntu 4.9-20140406-0ubuntu1) 4.9.0 20140405 (experimental) [trunk revision 209157]
Run Code Online (Sandbox Code Playgroud)

是不是gccgo应该能够对这段代码进行矢量化?具有相同gcc选项的等效C代码完全使用AVX指令进行矢量化...

UPDATE

在这里你有相应的C例子:

#include <stdlib.h>

float sum(float *v, size_t n) {
    size_t i;
    float sum = 0;
    for(i = 0; i < n; i++) {
        sum += v[i];
    }
    return sum;
} …
Run Code Online (Sandbox Code Playgroud)

vectorization go gccgo

20
推荐指数
1
解决办法
442
查看次数

如何在2019年在OpenCV中正确多线程?

背景:

我在OpenCV中阅读了一些关于多线程的文章和帖子:

  • 一方面,您可以使用TBB或OpenMP支持构建OpenCV,从而在内部并行化OpenCV的功能.
  • 另一方面,您可以自己创建多个线程并并行调用函数以在应用程序级别实现多线程.

但我无法得到一致的答案,哪种多线程方法是正确的方法.

关于TBB,2012年的答案有5个赞成票:

使用WITH_TBB = ON时,OpenCV会尝试使用多个线程来执行某些功能.问题是目前只有一个功能强大的TBB(可能是十几个).所以,很难看到任何加速.这里的OpenCV理念是应用程序应该是多线程的,而不是OpenCV函数.[...]

关于应用程序级别的多线程,主持人对answers.opencv.org评论:

请避免在opencv中使用自己的多线程.很多函数显然不是线程安全的.而是使用TBB或openmp支持重建opencv库.

但有3个赞成票的另一个答案是:

库本身是线程安全的,因为您可以同时多次调用库,但数据并不总是线程安全的.

问题描述:

所以我认为在应用程序级别上使用(多)线程至少是可以的.但是,当我的程序运行较长时间时,我遇到了奇怪的性能问题.

在研究了这些性能问题之后,我创建了这个最小,完整且可验证的示例代码:

#include "opencv2\opencv.hpp"
#include <vector>
#include <chrono>
#include <thread>

using namespace cv;
using namespace std;
using namespace std::chrono;

void blurSlowdown(void*) {
    Mat m1(360, 640, CV_8UC3);
    Mat m2(360, 640, CV_8UC3);
    medianBlur(m1, m2, 3);
}

int main()
{
    for (;;) {
        high_resolution_clock::time_point start = high_resolution_clock::now();

        for (int k = 0; k < 100; k++) {
            thread t(blurSlowdown, nullptr);
            t.join(); …
Run Code Online (Sandbox Code Playgroud)

c++ performance multithreading opencv vectorization

20
推荐指数
1
解决办法
3266
查看次数

矢量规范的矢量数组在MATLAB中

norm在MATLAB中调用矩阵时,它返回所谓的"矩阵范数"(标量值),而不是矢量范数数组.有没有办法在没有循环的情况下获得矩阵中每个向量的范数并利用MATLAB的向量化?

arrays matlab normalization matrix vectorization

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

加权Gram-Schmidt正交化的MATLAB优化

我在MATLAB中有一个函数,它执行Gram-Schmidt正交化,并对内积进行了非常重要的加权(我不认为MATLAB的内置函数支持这一点).据我所知,这个功能效果很好,但是在大型矩阵上它太慢了.改善这种情况的最佳方法是什么?

我已经尝试转换为MEX文件,但我失去了与我正在使用的编译器的并行化,因此它更慢.

我想在GPU上运行它,因为元素倍增是高度并行化的.(但我更喜欢实现方便携带)

任何人都可以将此代码矢量化或加快速度吗?我不确定如何优雅地做到这一点......

我知道这里的stackoverflow思想是惊人的,认为这是一个挑战:)

功能

function [Q, R] = Gram_Schmidt(A, w)
    [m, n] = size(A);
    Q = complex(zeros(m, n));
    R = complex(zeros(n, n));
    v = zeros(n, 1);

    for j = 1:n
        v = A(:,j);
        for i = 1:j-1
            R(i,j) = sum(   v    .* conj( Q(:,i) ) .* w ) / ...
                     sum( Q(:,i) .* conj( Q(:,i) ) .* w );
            v = v - R(i,j) * Q(:,i);
        end
        R(j,j) = norm(v);
        Q(:,j) = v / R(j,j);
    end …
Run Code Online (Sandbox Code Playgroud)

optimization performance matlab linear-algebra vectorization

19
推荐指数
2
解决办法
1829
查看次数