我正在 MATLAB 中重写一个 Monte Carlo 仿真模型,重点是可读性。该模型涉及许多粒子,表示为 (x,y,z),它们在具有特定终止概率的一小组状态上随机游走。与输出相关的信息是在给定状态终止的粒子数。
模拟需要足够的粒子,单独为每个粒子运行它的成本高得令人望而却步。矢量化似乎是从 MATLAB 中获得性能的方法,但是有没有任何惯用的方法可以在 MATLAB 中创建此仿真的矢量化版本?
我正在用头撞墙来完成这个 - 我什至尝试创建一个 (nStates x nParticles) 矩阵来表示每个粒子状态组合,但是这种方法在可读性方面很快就会失控,因为粒子从状态反弹相互独立地陈述。我应该硬着头皮改用更适合这个的语言吗?
我有一个 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
我有数组,需要动态窗口的最大滚动差异。
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) 我正在测试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) 我正在努力解决 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) 我有两个 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) 我试图在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)
我的环境信息:
postgres 上已安装的扩展列表
Name | Version | Schema | Description
---------+---------+------------+--------------------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural …Run Code Online (Sandbox Code Playgroud) 我正在编写一个包装器容器模板类,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
我有一个非常大的时间序列,我需要根据开头的某个任意值创建一个不同的时间序列,并在当前时间段内进行更改.在真实数据集中,此更改取决于数据框的其他变量,但出于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) 假设我在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)
我想通过添加零对角线转换A成NxN矩阵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) vectorization ×10
python ×5
matlab ×2
numpy ×2
c++ ×1
covariance ×1
data.table ×1
diagonal ×1
dot-product ×1
gcc ×1
java ×1
jit ×1
langchain ×1
loops ×1
matrix ×1
max ×1
montecarlo ×1
numba ×1
postgresql ×1
pytorch ×1
r ×1
simulation ×1
time-series ×1