我正在研究一个MATLAB项目,我想用C++和Eigen重新实现计算量最大的部分.我想知道是否有办法执行以下操作(MATLAB语法):
B = A(A < 3);
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉MATLAB的人,上述命令初始化由A中单元格构成的矩阵B,其值小于3.
我从Eigen论坛的帖子中看到,可以通过以下方式获得感兴趣的指数:
MatrixXi indices = (A.array() < 3).cast<int>();
Run Code Online (Sandbox Code Playgroud)
我想拥有的是:
MatrixXd B = A(A.array() < 3);
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在尝试使用NumPy和矢量化操作来使代码段运行得更快.然而,我似乎误解了如何对这段代码进行矢量化(可能是由于对矢量化的理解不完全).
这是带循环的工作代码(A和B是已设置大小的2D数组,已经初始化):
for k in range(num_v):
B[:] = A[:]
for i in range(num_v):
for j in range(num_v):
A[i][j] = min(B[i][j], B[i][k] + B[k][j])
return A
Run Code Online (Sandbox Code Playgroud)
这是我尝试矢量化上面的代码:
for k in range(num_v):
B = numpy.copy(A)
A = numpy.minimum(B, B[:,k] + B[k,:])
return A
Run Code Online (Sandbox Code Playgroud)
为了测试这些,我使用了以下代码,上面的代码包含在一个名为'algorithm'的函数中:
def setup_array(edges, num_v):
r = range(1, num_v + 1)
A = [[None for x in r] for y in r] # or (numpy.ones((num_v, num_v)) * 1e10) for numpy
for i in r:
for j in r:
val = …Run Code Online (Sandbox Code Playgroud) 我有一个熊猫系列,目前看起来像这样:
14 [Yellow, Pizza, Restaurants]
...
160920 [Automotive, Auto Parts & Supplies]
160921 [Lighting Fixtures & Equipment, Home Services]
160922 [Food, Pizza, Candy Stores]
160923 [Hair Removal, Nail Salons, Beauty & Spas]
160924 [Hair Removal, Nail Salons, Beauty & Spas]
Run Code Online (Sandbox Code Playgroud)
我希望从根本上将其重塑为一个看起来像这样的数据框......
Yellow Automotive Pizza
14 1 0 1
…
160920 0 1 0
160921 0 0 0
160922 0 0 1
160923 0 0 0
160924 0 0 0
Run Code Online (Sandbox Code Playgroud)
即.一个逻辑结构,指出每个观察(行)属于哪些类别.
我能够编写基于循环的代码来解决这个问题,但考虑到我需要处理大量的行,这将是非常缓慢的.
有谁知道这种问题的矢量化解决方案?我会非常感激的.
编辑:有509个类别,我有一个列表.
我正在使用的算法花费了大部分时间将一个数组与一行矩阵进行比较.如果任何第i个元素相同,则算法调用过程A,如果没有元素相等,则调用过程B. 例如:
[1, 4, 10, 3, 5]并且[5, 3, 0, 3, 0]调用A()因为对于第4个位置,两个数组中的值都是3.
[1, 4, 10, 3, 5]并且[5, 3, 0, 1, 0]调用B()因为对于相同的位置,值永远不会相同.
注意(1)数组和矩阵行总是具有相同的大小N,以及(2)算法A() 在至少一个值匹配时调用.
在C中执行此操作的最简单但非常天真的方法是:
for(int i=0; i<N; i++)
if( A[i] == B[i] ){
flag = 1;
break;
}
Run Code Online (Sandbox Code Playgroud)
这仍然非常低效.在最坏的情况下,我将进行N次比较.这里真正的问题是该算法可以进行数万亿次这些比较.
N(矩阵中数组/行的大小)从100到1000不等.我想加快这个程序.我看了矢量化,发现我可以使用cmpeq_pd.但是,矢量化仍然有限,因为我的所有条目都是 longs.有没有人有想法?我可以申请面具吗?
更多信息/背景:
我是GCC的C矢量扩展的新手.根据手册,将一个向量与另一个向量进行比较的结果(test = vec1> vec2;)是"test"在每个元素中包含0,为false,每个元素中为-1为真.
但是如何快速检查是否有任何元素比较是真的?而且,进一步说,如何判断哪个是比较真实的第一个元素?
例如,用:
vec1 = {1,1,3,1};
vec2 = {1,2,2,2};
test = vec1 > vec2;
Run Code Online (Sandbox Code Playgroud)
我想确定"test"是否包含任何真值(非零元素).在这种情况下,我希望"test"减少为true,因为存在一个vec1大于vec2的元素,因此test中的元素包含-1.
另外,或者,我想快速发现WHICH元素未通过测试.在这种情况下,这只是数字2.换句话说,我想测试哪个是第一个非零元素.
int hasAnyTruth = ...; // should be non-zero. "bool" works too since C99
int whichTrue = ...; // should contain 2, because test[2] == -1
Run Code Online (Sandbox Code Playgroud)
我想我们可以使用simd reduction-addition命令(?)将向量中的所有内容加到一个数字中并将该总和与0进行比较,但我不知道如何(或者是否有更快的方法).我猜第二个问题需要某种形式的argmax,但同样,我不知道如何指示GCC在矢量上使用它.
我知道3种方法,但据我所知,通常只使用前2种方法:
使用andps或屏蔽符号位andnotps.
将值从零减去否定,然后得到原始的最大值并否定.
subps完成才能使用该maxps指令.与选项2类似,将原始值从零减去否定,但随后使用原始值"按位"和"按位" andps.我运行了一个测试,将其与方法2进行比较,除了处理NaNs 之外,它似乎与方法2的行为相同,在这种情况下,结果将NaN与方法2的结果不同.
andps通常比速度快maxps.NaN涉及到s 时,这是否会导致任何意外行为?也许不是,因为a NaN仍然是a NaN,即使它是一个不同的值NaN,对吧?欢迎提出想法和意见.
似乎在Julia鼓励编写devectorized代码.甚至有一个包试图为你做这件事.
我的问题是为什么?
首先,从用户体验方面来讲,矢量化代码更简洁(代码更少,然后错误的可能性更小),更清晰(因此更容易调试),更自然的编写代码的方式(至少对于来自科学计算背景,朱莉娅试图迎合).能够写出类似vector'vector或vector'Matrix*vector非常重要的东西,因为它对应于实际的数学表示,这就是科学计算人员在脑海中想到它的方式(而不是嵌套循环).我讨厌这样的事实,这不是写这个的最好方法,并且将它重新分解为循环会更快.
目前,编写快速代码的目标与简洁/清晰的代码之间似乎存在冲突.
其次,技术原因是什么?好吧,我明白量化的代码创建额外的临时等,但矢量化功能(例如broadcast(),map()等),具有多线程他们的潜力,我认为多线程的好处会超过临时工和其他缺点的开销矢量化函数使它们比常规循环更快.
Julia中的矢量化函数的当前实现是否隐含多线程?
如果没有,是否有工作/计划为向量化函数添加隐式并发并使它们比循环更快?
我要去看这篇论文http://cs.stanford.edu/~quocle/paragraph_vector.pdf
它说明了这一点
"对图矢量和单词矢量进行平均或连接以预测上下文中的下一个单词.在实验中,我们使用连接作为组合矢量的方法."
连接或平均如何工作?
示例(如果第1段包含word1和word2):
word1 vector =[0.1,0.2,0.3]
word2 vector =[0.4,0.5,0.6]
concat method
does paragraph vector = [0.1+0.4,0.2+0.5,0.3+0.6] ?
Average method
does paragraph vector = [(0.1+0.4)/2,(0.2+0.5)/2,(0.3+0.6)/2] ?
Run Code Online (Sandbox Code Playgroud)
也是从这张图片:
据说:
段落标记可以被认为是另一个单词.它充当记忆,记住当前上下文中缺少的内容 - 或段落的主题.出于这个原因,我们经常将此模型称为段落向量的分布式存储模型(PV-DM).
段落标记是否等于段落向量等于on?
我正在浏览矢量库并发现了一个{-# INLINE_FUSED transform #-},我想知道它是做什么的?我看到它定义在vector.h其他地方.
我最近开始使用pylibfreenect2在Linux上使用Kinect V2.
当我第一次能够在散点图中显示深度帧数据时,我很失望地看到没有任何深度像素似乎在正确的位置.
我做了一些研究,并意识到有一些简单的触发来完成转换.
为了测试,我开始使用pylibfreenect2中的预编写函数,该函数接受列,行和深度像素强度,然后返回该像素的实际位置:
X, Y, Z = registration.getPointXYZ(undistorted, row, col)
Run Code Online (Sandbox Code Playgroud)
使用getPointXYZ()或getPointXYZRGB()的唯一缺点是它们一次只能处理一个像素.这在Python中可能需要一段时间,因为它需要使用嵌套的for循环,如下所示:
n_rows = d.shape[0]
n_columns = d.shape[1]
out = np.zeros((n_rows * n_columns, 3), dtype=np.float64)
for row in range(n_rows):
for col in range(n_columns):
X, Y, Z = registration.getPointXYZ(undistorted, row, col)
out[row * n_columns + col] = np.array([Z, X, -Y])
Run Code Online (Sandbox Code Playgroud)
我试图更好地理解getPointXYZ()如何计算坐标.据我所知,它看起来类似于OpenKinect for Forfor函数:depthToPointCloudPos().虽然我怀疑libfreenect2的版本还有更多内容.
使用该gitHub源代码作为示例,然后我尝试在Python中重新编写它以进行我自己的实验,并出现以下内容:
#camera information based on the Kinect v2 hardware
CameraParams = {
"cx":254.878,
"cy":205.395,
"fx":365.456,
"fy":365.456,
"k1":0.0905474, …Run Code Online (Sandbox Code Playgroud) vectorization ×10
python ×3
c ×2
comparison ×2
numpy ×2
algorithm ×1
c++ ×1
categories ×1
compare ×1
doc2vec ×1
eigen ×1
gcc ×1
gensim ×1
haskell ×1
inline ×1
julia ×1
kinect ×1
libfreenect2 ×1
nlp ×1
optimization ×1
pandas ×1
performance ×1
simd ×1
sse ×1
submatrix ×1
vector ×1
word2vec ×1
x86 ×1