当我分析我正在处理的代码时,一个特别的热点是以下循环:
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) 试图将我的思维包裹在矢量化中,尝试更快地进行模拟,我发现了这种非常基本的流行病模拟.代码来自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) 我有两个3-D阵列,A和B,每个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) 当我试图将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.
非常感谢帮助
我已经使用python创建了一个文本分类模型.我有CountVectorizer,它产生一个2034行和4063列(唯一字)的文档术语矩阵.我保存了用于新测试数据的模型.我的新测试数据
test_data = ['Love', 'python', 'every','time']
Run Code Online (Sandbox Code Playgroud)
但问题是我将上述测试数据标记转换为特征向量,但形状不同.因为该模型期望4063向量.我知道如何通过使用CountVectorizer的词汇表来解决它,并在测试数据中搜索每个标记并将其放入该索引中.但是有没有简单的方法来处理scikit-learn本身的问题.
为了计算limsup序列,让我们计算,每个i的max(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?
我需要生成一个随机数向量,该向量位于上限和下限之间。每个数字都有其自己的界限-因此界限也是向量。
目前,我使用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) 我一直在努力寻找一种更有效的方法来迭代图像并在阈值上拆分它们的属性.在网上搜索并与一些编程朋友讨论时,他们向我介绍了向量化(特别是使用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语句搜索每个像素.
例如,我有排序的向量:[9 9 9 10 13 13 14 15]我想给每个元素它的顺序(并保持相同的元素).即我希望答案是:[1 1 1 2 3 3 4 5]
有任何想法吗?谢谢!
注意:我的真实矢量要大得多(大约50,000个元素)所以我不能手动完成...
我正在进行蒙特卡罗模拟,其中每次重复都需要随机数随机变量的总和或乘积.我的问题是如何有效地做到这一点,因为整个模拟应该尽可能地矢量化.
例如,假设我们要采取的总和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可能变化很大,即很容易就是我必须绘制两倍或三倍的随机数而不是所需数量.
vectorization ×10
arrays ×3
matlab ×3
performance ×3
python ×3
r ×3
numpy ×2
c++ ×1
dimension ×1
matrix ×1
optimization ×1
random ×1
scikit-learn ×1
simd ×1