标签: vectorization

为什么这个循环没有矢量化?

当我分析我正在处理的代码时,一个特别的热点是以下循环:

for(int loc = start; loc<end; ++loc)
    y[loc]+=a[offset+loc]*x[loc+d];
Run Code Online (Sandbox Code Playgroud)

数组y,a和x没有重叠.在我看来,像这样的循环应该很容易矢量化,但是当我使用g ++编译选项"-O3 -ftree-vectorize -ftree-vectorizer-verbose = 1"时,我没有得到这个特定循环被矢量化的迹象.但是,在上面的代码之前发生了一个循环:

for(int i=0; i<m; ++i)
    y[i]=0;
Run Code Online (Sandbox Code Playgroud)

确实根据输出进行了矢量化.有关为什么第一个循环没有矢量化,或者我怎么能解决这个问题的想法?(我不是所有关于矢量化概念的人,所以我很可能错过了一些非常明显的东西)

根据Oli的建议,提高详细程度会产生以下注释(虽然我通常擅长阅读编译器警告/错误/输出,但我不知道这意味着什么):

./include/mv_ops.h:89: note: dependence distance  = 0.
./include/mv_ops.h:89: note: accesses have the same alignment.
./include/mv_ops.h:89: note: dependence distance modulo vf == 0 between *D.50620_89 and *D.50620_89
./include/mv_ops.h:89: note: not vectorized: can't determine dependence between *D.50623_98 and *D.50620_89
Run Code Online (Sandbox Code Playgroud)

c++ optimization simd vectorization

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

矢量化模拟

试图将我的思维包裹在矢量化中,尝试更快地进行模拟,我发现了这种非常基本的流行病模拟.代码来自http://www.amazon.com/Introduction-Scientific-Programming-Simulation-Using/dp/1420068725/ref=sr_1_1?ie=UTF8&qid=1338069156&sr=8-1

#program spuRs/resources/scripts/SIRsim.r

SIRsim <- function(a, b, N, T) {
  # Simulate an SIR epidemic
  # a is infection rate, b is removal rate
  # N initial susceptibles, 1 initial infected, simulation length T
  # returns a matrix size (T+1)*3 with columns S, I, R respectively
  S <- rep(0, T+1)
  I <- rep(0, T+1)
  R <- rep(0, T+1)
  S[1] <- N
  I[1] <- 1
  R[1] <- 0
  for (i in 1:T) {
    S[i+1] <- rbinom(1, S[i], (1 - a)^I[i]) …
Run Code Online (Sandbox Code Playgroud)

r vectorization

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

基本R:带有循环的三维数组中的乘法元素

我有两个3-D阵列,AB,每个2 x 3 x 3.下面显示的例子(这将有助于澄清我想如何繁殖).

 A1   A2   A3                             B1   B2   B3  
 A4   A5   A6                             B4   B5   B6

 A7   A8   A9                             B7   B8   B9
 A10  A11  A12                            B10  B11  B12

 A13  A14  A15                            B13  B14  B15
 A16  A17  A18                            B16  B17  B18
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建一个矩阵,其中3 A矩阵被平均,并且某个位置的值由相应的B值加权......我无法解释,但是例如,第一个元素是:

[(A1*B1)+(A7*B7)+(A13*B13)] / sum(B1,B7,B13).
Run Code Online (Sandbox Code Playgroud)

另一个因素是:

[(A5*B5)+(A11*B11)+(A17*B17)] / sum(B5,B11,B17).
Run Code Online (Sandbox Code Playgroud)

等等...结果是2 x 3矩阵.我一直在玩嵌套for循环的不同组合,下面显示了一个例子,但我还没弄清楚如何正确地做到这一点......帮助升值.

for (j in 1:2){
     for (k in 1:3){
          ans[j*k]=sum(A[j,k,1:3]*B[j,k,1:3])/sum(B[j,k,1:3])
     }
}
Run Code Online (Sandbox Code Playgroud)

arrays r linear-algebra vectorization matrix-multiplication

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

将二维矩阵与向量相乘以跨越第三维 - MATLAB

当我试图将m x n矩阵与p-dimensional向量相乘时,我遇到了一些困难.

试图避免for循环,这是我想要实现的

enter code here
M = [1 2 3;                   p = [1;2;3]
     4 5 6;
     7 8 9]
Run Code Online (Sandbox Code Playgroud)

我想获得一个3x3x3矩阵,其中第三维中的切片只是M与相应条目相乘的条目p.

非常感谢帮助

matlab matrix vectorization multiplication dimension

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

CountVectorizer矩阵随新的测试数据而变化以进行分类?

我已经使用python创建了一个文本分类模型.我有CountVectorizer,它产生一个2034行和4063列(唯一字)的文档术语矩阵.我保存了用于新测试数据的模型.我的新测试数据

 test_data = ['Love', 'python', 'every','time']
Run Code Online (Sandbox Code Playgroud)

但问题是我将上述测试数据标记转换为特征向量,但形状不同.因为该模型期望4063向量.我知道如何通过使用CountVectorizer的词汇表来解决它,并在测试数据中搜索每个标记并将其放入该索引中.但是有没有简单的方法来处理scikit-learn本身的问题.

python vectorization scikit-learn

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

在Numpy中运行max/limsup:什么优化?

为了计算limsup序列,让我们计算,每个imax(A[i:]):

import numpy as np
n = 10
A = np.random.random(n)
M = np.zeros(n)

for i in range(n):
    M[i] = np.max(A[i:])
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

[ 0.85436167  0.92015564  0.44302976  0.56030154  0.16415721  0.39810583   0.65692947  0.5884984   0.57646131  0.0774121 ]
[ 0.92015564  0.92015564  0.65692947  0.65692947  0.65692947  0.65692947   0.65692947  0.5884984   0.57646131  0.0774121 ]
Run Code Online (Sandbox Code Playgroud)

n100万时,这非常非常慢.

可以使用什么优化来有效地计算阵列M

python arrays performance numpy vectorization

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

将runif()应用于上下限向量

我需要生成一个随机数向量,该向量位于上限和下限之间。每个数字都有其自己的界限-因此界限也是向量。

目前,我使用for循环执行此操作,但可能会有更好的方法。

# Bounds
lb <- c(1,2,3,4)
ub <- c(9,7,5,8)

# Generate rnd numbers, stored in rndnum
rndnum <- runif(1, lb[1], ub[1])
for(i in 2:length(lb))
  rndnum <- c(rndnum, runif(1,lb[i], ub[i]))
Run Code Online (Sandbox Code Playgroud)

random r vectorization

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

使用Python/NumPy矢量化图像阈值

我一直在努力寻找一种更有效的方法来迭代图像并在阈值上拆分它们的属性.在网上搜索并与一些编程朋友讨论时,他们向我介绍了向量化(特别是使用numpy)函数的概念.经过大量的搜索和反复试验,我似乎无法掌握它.有人可以给我一个链接,或建议如何使以下代码更有效?

Im = plt.imread(img)
Imarray = np.array(Im)
for line in Imarray:
    for pixel in line:
        if pixel <= 20000:
            dim_sum += pixel
            dim_counter += 1
        if pixel > 20000:
            bright_sum += pixel
            bright_counter += 1
bright_mean = bright_sum/bright_counter
dim_mean = dim_sum/dim_counter
Run Code Online (Sandbox Code Playgroud)

基本上,每个像素保持0到30000之间的亮度,我试图分别平均低于20000和高于20000的所有像素.我知道如何做到这一点的最好方法是使用for循环(在python中很慢)并使用if语句搜索每个像素.

python arrays numpy image-processing vectorization

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

如何在向量中给出每个元素的顺序

例如,我有排序的向量:[9 9 9 10 13 13 14 15]我想给每个元素它的顺序(并保持相同的元素).即我希望答案是:[1 1 1 2 3 3 4 5]

有任何想法吗?谢谢!

注意:我的真实矢量要大得多(大约50,000个元素)所以我不能手动完成...

performance matlab vectorization

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

绘制随机数的非完整矩阵

我正在进行蒙特卡罗模拟,其中每次重复都需要随机数随机变量的总和或乘积.我的问题是如何有效地做到这一点,因为整个模拟应该尽可能地矢量化.

例如,假设我们要采取的总和5,10并且3随机数,由向量表示len = [5;10;3].那么我目前正在做的是绘制一个完整的随机数矩阵:

A = randn(length(len),max(len));
Run Code Online (Sandbox Code Playgroud)

创建不需要的数字的掩码:

lenlen = repmat(len,1,max(len));
idx = repmat(1:max(len),length(len),1);
mask = idx>lenlen;
Run Code Online (Sandbox Code Playgroud)

然后我可以"填充"矩阵,因为我感兴趣的是填充必须为零(对于产品的情况,填充必须为1)

A(mask)=0;
Run Code Online (Sandbox Code Playgroud)

获得:

A =

1.7708   -1.4609   -1.5637   -0.0340    0.9796         0         0         0         0         0
1.8034   -1.5467    0.3938    0.8777    0.6813    1.0594   -0.3469    1.7472   -0.4697   -0.3635
1.5937   -0.1170    1.5629         0         0         0         0         0         0         0
Run Code Online (Sandbox Code Playgroud)

之后我可以将它们加在一起

B = sum(A,2);
Run Code Online (Sandbox Code Playgroud)

但是,我发现我必须绘制太多的随机数然后将它们扔掉,这是多余的.在实际情况中,我需要在数十万次重复的范围内,并且矢量len可能变化很大,即很容易就是我必须绘制两倍或三倍的随机数而不是所需数量.

performance matlab vectorization

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