如果我有像这样的双重求和,我如何完全矢量化它?(无循环)
一个好的起点是获取向量 i 和 j。例如,如果 n = 2:
i = 0:2
j = c(0,0,1,0,1,2)
Run Code Online (Sandbox Code Playgroud)
那么接下来我们应该如何应对呢?
我正在尝试编写 BSF 的矢量化实现作为练习,但我陷入困境,它不起作用。
算法:
short bitScanForward(int16_t bb)
{
constexpr uint16_t two = static_cast<uint16_t>(2);
constexpr uint16_t zero = static_cast<uint16_t>(0);
uint16_t lsb;
bb &= -bb;
lsb = (unsigned short)bb
| (unsigned short)(bb >> short(8));
return static_cast<short>(((((((unsigned short)(bb >>
short(8)) != zero) * two)
+ ((lsb & unsigned short(0xf0f0)) != zero)) * two)
+ ((lsb & unsigned short(0xcccc)) != zero)) * two)
+ ((lsb & unsigned short(0xaaaa)) != zero);
}
Run Code Online (Sandbox Code Playgroud)
我的矢量代码:
[[nodiscard]] inline __m128i _mm_cmpneq_epi16(const __m128i& a, const __m128i& …Run Code Online (Sandbox Code Playgroud) 最近在开发一个Python脚本,实现一个特定的数学函数,如下图所示
其中指数化是周期性的并且1 <= j <= n. 功能比较复杂,受到之前一个问题的启发。该代码的主要目的是评估大型数组x(大小为 5000 或更大)的数学函数。以下是该函数在 Python 中的当前实现:
import numpy as np
import sys, os
def compute_y(x, L, v):
n = len(x)
y = np.zeros(n)
for k in range(L+1):
# Generate the indices for the window around each j, with periodic wrapping
indices = np.arange(-k, k+1)
# Compute the weights
weights_1 = k - np.abs(indices)
weights_2 = k + 1 - np.abs(indices)
weights_d = np.ones(2*k+1)
# For each j, take the …Run Code Online (Sandbox Code Playgroud) 我有以下矩阵:
X=1 2 3
Y=4 5 6
A=1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)
我想要做
for each (i,j) in A
v = A(i,j)*X - Y
B(i,j) = v * v'
Run Code Online (Sandbox Code Playgroud)
即A的每个元素乘以向量X,然后结果向量从自身中减去Y,最后我们取该向量的内积来得到一个数.
可以不用for循环吗?
在我的程序中,我需要计算总和:
.
我计算这个总和与新值2500倍C和z.
参数z可以是矢量.我编写了简单的for循环和矢量化版本代码,如下所示:
K = 200;
n_z = 40000;
C = ones(K,1); % an example, in real life the arey some coefficients (at next call will be new)
k = 0:K-1;
z = linspace(0, 2*pi, n_z); % at next call will be new
tic;
my_sum_for = zeros(1, K);
for i=1:n_z
my_sum_for(i) = C' * tan(k' * z(i));
end
toc; % Elapsed time is 1.820485 seconds.
tic;
my_sum = C' * tan(k' * z); …Run Code Online (Sandbox Code Playgroud) 我有一个元素数组和另外两个数组
我正在做这样的事情:
a=[1 3 2 45 4 23 16];
b=[3 9 1 27 33 50 5];
m=10;
k=linspace(min(a),max(a),m);
res=zeros(m,1);
for i=1:m
res(i) = sum((a < k(i)).*(b < k(i)));
end
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有循环的情况下获得相同的结果?
我在R中有一个三维物体,它包含n个方形矩阵.例如:
myObject[,,1] # returns a square matrix
myObject[,,2] # returns a square matrix of the same size
...
Run Code Online (Sandbox Code Playgroud)
对象内的所有矩阵都具有相同的大小.我想把所有矩阵加在一起,没有循环.如果我知道对象中有多少个矩阵,这很简单.例如:
matrixSum <- myObject[,,1] + myObject[,,2] + myObject[,,3]
Run Code Online (Sandbox Code Playgroud)
问题是,我需要对几千个这样的对象执行此操作,并且每个对象中都有可变数量的矩阵.有没有办法可以在没有循环的情况下做到这一点?从某种意义上说,我想尝试"矢量化"这个总和.
对于大小为60000行,10列的2D数组,我有如下阵列
[0 0 0 0 0 1 0 0 0 0]
[1 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 1]
.......
Run Code Online (Sandbox Code Playgroud)
任何行只包含一个'1'
我必须将它减少到一个行或列向量,它显示我们有一个1的索引.例如,对于上面显示的行,我们必须最终得到
[6,1,10...] 超过第60,000个值.
如何在没有循环的Matlab中做到这一点?
我有一个L张量(ndarray对象)列表,每个都有几个索引.我需要根据连接图收缩这些指数.
连接被编码在元组列表中,((m,i),(n,j))表示" 将张量的第i个索引与张量L[m]的第j个索引收缩" L[n].
如何处理非平凡连接图?第一个问题是,只要我收缩一对索引,结果就是一个不属于列表的新张量L.但即使我解决了这个问题(例如,通过为所有张量的所有索引提供唯一标识符),也存在一个问题,即人们可以选择任何顺序来执行收缩,而某些选择会在计算中期产生不必要的巨大影响(即使最终结果很小).建议?
我想创建长度的数组Ns(Ns+1)和我需要的第一Ns要素是0,下一个Ns元素是1,...,最后Ns是Ns.
我很清楚有很多方法可以做到这一点for-loops,我想避免这个特定的任务.我正在寻找一种方法来使用matlab函数和矢量化的概念来做到这一点.
例如,我有一个类似的数组,我想填充,0, 1, 2, ..., Ns, 0, 1, 2, ..., Ns, 0, 1, 2, ...我完成了
my_array = repmat(0:Ns, 1, Ns+1);
Run Code Online (Sandbox Code Playgroud)
是否有类似的方法来实现我的目的?
我认为我能做的一件事就是创建一个像矩阵一样的矩阵
0 0 0 ... 0
1 1 1 ... 1
... ... ...
Ns Ns .. Ns
Run Code Online (Sandbox Code Playgroud)
然后连接线; 我知道如何创建矩阵,但不知道如何将线连接成数组.
还有其他方法吗?命令的建议也是可以接受的!
谢谢.
vectorization ×10
matlab ×5
arrays ×2
numpy ×2
performance ×2
python ×2
r ×2
c++ ×1
for-loop ×1
matrix ×1
numpy-einsum ×1
optimization ×1
reduction ×1
simd ×1
sse ×1
sum ×1