标签: vectorization

如何在 MATLAB 中矢量化随机游走仿真

我正在 MATLAB 中重写一个 Monte Carlo 仿真模型,重点是可读性。该模型涉及许多粒子,表示为 (x,y,z),它们在具有特定终止概率的一小组状态上随机游走。与输出相关的信息是在给定状态终止的粒子数。

模拟需要足够的粒子,单独为每个粒子运行它的成本高得令人望而却步。矢量化似乎是从 MATLAB 中获得性能的方法,但是有没有任何惯用的方法可以在 MATLAB 中创建此仿真的矢量化版本?

我正在用头撞墙来完成这个 - 我什至尝试创建一个 (nStates x nParticles) 矩阵来表示每个粒子状态组合,但是这种方法在可读性方面很快就会失控,因为粒子从状态反弹相互独立地陈述。我应该硬着头皮改用更适合这个的语言吗?

simulation matlab markov-chains vectorization montecarlo

9
推荐指数
1
解决办法
4014
查看次数

向量化 3D 数组的 NumPy 协方差

我有一个 3D numpy 形状数组(t, n1, n2)

x = np.random.rand(10, 2, 4)
Run Code Online (Sandbox Code Playgroud)

我需要计算另一个 3D 数组y,其形状(t, n1, n1)为:

y[0] = np.cov(x[0,:,:])
Run Code Online (Sandbox Code Playgroud)

...对沿第一个轴的所有切片依此类推。

所以,一个循环的实现将是:

y = np.zeros((10,2,2))
for i in np.arange(x.shape[0]):
    y[i] = np.cov(x[i, :, :])
Run Code Online (Sandbox Code Playgroud)

有什么方法可以将其矢量化,以便一次性计算所有协方差矩阵?我试着做:

x1 = x.swapaxes(1, 2)
y = np.dot(x, x1)
Run Code Online (Sandbox Code Playgroud)

但它没有用。

python numpy vectorization covariance multidimensional-array

9
推荐指数
1
解决办法
3964
查看次数

二维数组中每条对角线的最大值

我有数组,需要动态窗口的最大滚动差异。

a = np.array([8, 18, 5,15,12])
print (a)
[ 8 18  5 15 12]
Run Code Online (Sandbox Code Playgroud)

所以首先我自己创造差异:

b = a - a[:, None]
print (b)
[[  0  10  -3   7   4]
 [-10   0 -13  -3  -6]
 [  3  13   0  10   7]
 [ -7   3 -10   0  -3]
 [ -4   6  -7   3   0]]
Run Code Online (Sandbox Code Playgroud)

然后将上三角矩阵替换为 0:

c = np.tril(b)
print (c)
[[  0   0   0   0   0]
 [-10   0   0   0   0]
 [  3  13   0   0   0]
 [ -7   3 -10 …
Run Code Online (Sandbox Code Playgroud)

python numpy max vectorization diagonal

9
推荐指数
1
解决办法
741
查看次数

OpenJDK Panama Vector API jdk.incubator.vector 没有为 Vector 点积提供改进的结果

我正在测试OpenJDK Panama Vector API jdk.incubator.vector 并在亚马逊 c5.4xlarge 实例上进行了测试。但在每种情况下,简单展开的矢量点积都无法执行 Vector API 代码。

我的问题是:为什么我无法获得如Richard Startin 的博客中所示的性能提升。同样的性能提升也在这次会议meetup中被英特尔人讨论过。有什么不见了?

JMH 基准测试结果:

Benchmark                                              (size)   Mode  Cnt      Score    Error  Units

FloatVector256DotProduct.unrolled                       1048576  thrpt   25   2440.726 ? 21.372  ops/s
FloatVector256DotProduct.vanilla                        1048576  thrpt   25    807.721 ?  0.084  ops/s
FloatVector256DotProduct.vector                         1048576  thrpt   25    909.977 ?  6.542  ops/s
FloatVector256DotProduct.vectorUnrolled                 1048576  thrpt   25    887.422 ?  5.557  ops/s
FloatVector256DotProduct.vectorfma                      1048576  thrpt   25    916.955 ?  4.652  ops/s
FloatVector256DotProduct.vectorfmaUnrolled              1048576  thrpt   25    877.569 ?  1.451  ops/s

JavaDocExample.simpleMultiply                           1048576  thrpt …
Run Code Online (Sandbox Code Playgroud)

java vectorization dot-product project-panama

9
推荐指数
1
解决办法
1018
查看次数

guvectorize 在 nopython 模式下不解析类型

我正在努力解决 numba 错误 Untyped global name 'is_a_subset': Cannot determine Numba type of <class 'numba.np.ufunc.gufunc.GUFunc'> 这通常意味着我摸索并使用了 numba 不支持的方法。以下代码失败。

@guvectorize("(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
    out[:]=np.array([item in x for item in y])

@njit()
def test(x,y,z):
    is_a_subset(x,y,z)
    return z.mean()

x=np.array([[1,2,3],[3,2,1]])
y=np.array([[3,6,1],[1,2,3]])
z = np.empty_like(x)
test(x,y,z)
Run Code Online (Sandbox Code Playgroud)

然而,删除测试功能上的 njit 会使一切正常。

def test(x,y,z):
    is_a_subset(x,y,z)
    return z.mean()
Run Code Online (Sandbox Code Playgroud)

为什么 numba 在非 python 模式下难以解析类型?
我也尝试过没有不同的结果

@guvectorize(["f8[:],f8[:],f8[:]"],"(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
    out[:]=np.array([item in x for item in y])
Run Code Online (Sandbox Code Playgroud)

python jit vectorization numba

9
推荐指数
1
解决办法
418
查看次数

如何在给定轴中的某个索引之后将 pytorch 张量的所有元素设置为零,其中索引由另一个 pytorch 张量给出?

我有两个 PyTorch 张量

mask = torch.ones(1024, 64, dtype=torch.float32)
indices = torch.randint(0, 64, (1024, ))
Run Code Online (Sandbox Code Playgroud)

对于i中的每一行,我想将 的元素mask指定的索引后面的所有元素设置为零。例如,如果 的第一个元素是,那么我想设置。不使用for循环是否可以实现这一点?iindicesindices50mask[0, 50:]=0

for循环的解决方案:

for i in range(mask.shape[0]):
    mask[i, indices[i]:] = 0
Run Code Online (Sandbox Code Playgroud)

python vectorization pytorch

9
推荐指数
1
解决办法
3422
查看次数

postgresql 上不存在“向量”类型 - langchain

我试图在pgvector扩展和langchain的帮助下在 postgresql 上嵌入一些文档。不幸的是我遇到了以下错误:

(psycopg2.errors.UndefinedObject) type "vector" does not exist
LINE 4:  embedding VECTOR(1536), 
                   ^

[SQL: 
CREATE TABLE langchain_pg_embedding (
    collection_id UUID, 
    embedding VECTOR(1536), 
    document VARCHAR, 
    cmetadata JSON, 
    custom_id VARCHAR, 
    uuid UUID NOT NULL, 
    PRIMARY KEY (uuid), 
    FOREIGN KEY(collection_id) REFERENCES langchain_pg_collection (uuid) ON DELETE CASCADE
)
]
Run Code Online (Sandbox Code Playgroud)

我的环境信息:

  • pgvector泊坞窗图像ankane/pgvector:v0.4.1
  • 蟒蛇3.10.6, psycopg2 2.9.6, pgvector 0.1.6

postgres 上已安装的扩展列表

  Name   | Version |   Schema   |                Description                 
---------+---------+------------+--------------------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural …
Run Code Online (Sandbox Code Playgroud)

python postgresql vectorization langchain

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

C和C++中的堆数组与宽松编译器(GCC)矢量化的对齐

我正在编写一个包装器容器模板类,std::vector它会自动创建一个multi-resolution pyramid元素std::vector.

现在的关键问题是我希望金字塔的创建是(GCC)自动矢量化的.

内部存储在std :: vector和我的解析金字塔中的所有数据数组都是使用标准的new或allocator模板参数在堆上创建的.有没有我可以帮助编译器强制对我的数据进行特定对齐,以便矢量化可以在具有最佳对齐的元素(数组)(块)上运行(通常为16).

因此我使用自定义分配器, AlignmentAllocator但GCC自动向量化消息输出仍然在第144行中声明包含表达式的未对齐内存std::mr_vector::construct_pyramidmulti_resolution.hpp

for (size_t s = 1; s < snum; s++) { // for each cached scale
...
}
Run Code Online (Sandbox Code Playgroud)

如下

tests/../multi_resolution.hpp:144: note: Detected interleaving *D.3088_68 and MEM[(const value_type &)D.3087_61]
tests/../multi_resolution.hpp:144: note: versioning for alias required: can't determine dependence between *D.3088_68 and *D.3082_53
tests/../multi_resolution.hpp:144: note: mark for run-time aliasing test between *D.3088_68 and *D.3082_53
tests/../multi_resolution.hpp:144: note: versioning for alias …
Run Code Online (Sandbox Code Playgroud)

c++ gcc vectorization memory-alignment dynamic-memory-allocation

8
推荐指数
1
解决办法
1270
查看次数

R编程:使用先前计算的行来更新每一行

我有一个非常大的时间序列,我需要根据开头的某个任意值创建一个不同的时间序列,并在当前时间段内进行更改.在真实数据集中,此更改取决于数据框的其他变量,但出于MWE的目的,我按如下方式重新创建它:

initial_value <- 100
set.seed(123)
library(data.table)
df <- as.data.table(data.frame(num = c(1:10),change = rnorm(10)))
Run Code Online (Sandbox Code Playgroud)

新变量value定义为上一期间的自身值加上change当前期间的值.第一次观察中的值由任意选择确定initial_value.如果没有限制value,可以简单地创建

df <- df[, value0 := initial_value + cumsum(change)]
Run Code Online (Sandbox Code Playgroud)

这是非常快速的使用data.table.然而,遗憾的是,change也可能取决于前一时期的实际value情况.具体来说,假设每当它达到102时,系列需要到达initial_value下一个时段并在那里停留3个时段.因此,在以下数据框架中,我需要value在上面生成的代码中创建变量value0:

    num      change    value0     value
 1:   1 -0.56047565  99.43952  99.43952
 2:   2 -0.23017749  99.20935  99.20935
 3:   3  1.55870831 100.76806 100.76806
 4:   4  0.07050839 100.83856 100.83856
 5:   5  0.12928774 100.96785 100.96785
 6:   6  1.71506499 102.68292 102.68292
 7:   7  0.46091621 …
Run Code Online (Sandbox Code Playgroud)

loops r time-series vectorization data.table

8
推荐指数
1
解决办法
108
查看次数

在MATLAB中将矩形对角线添加到矩阵中

假设我在MATLAB中有一个A维度矩阵Nx(N-1),例如

N=5;
A=[1  2  3  4;
   5  6  7  8;
   9  10 11 12;
   13 14 15 16;
   17 18 19 20 ];
Run Code Online (Sandbox Code Playgroud)

我想通过添加零对角线转换ANxN矩阵B,即

B=[ 0  1   2   3   4;
    5  0   6   7   8;
    9  10  0   11  12;
    13 14  15  0   16;
    17 18  19  20  0];
Run Code Online (Sandbox Code Playgroud)

这段代码做我想要的:

B_temp = zeros(N,N); 
B_temp(1,:) = [0 A(1,:)];
B_temp(N,:) = [A(N,:) 0];
for j=2:N-1
    B_temp(j,:)= [A(j,1:j-1) 0 A(j,j:end)];
end
B …
Run Code Online (Sandbox Code Playgroud)

matlab matrix vectorization

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