我有以下矩阵:
X=1 2 3
A=1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)
我想要做
for each (i,j) in A
B(i,j) = sum(A(i,j)*x)
Run Code Online (Sandbox Code Playgroud)
即A的每个元素乘以向量X,并且我们对该向量的所有3个元素求和.
可以不用for循环吗?
所以,我有X,一个300乘1的矢量,我想要[1,X,X*X,X*X*X,......,X*X*...*X],一个300乘20的矩阵.
我该怎么做?
X=[2;1]
[X,X.*X,X.*X.*X]
ans =
2 4 8
1 1 1
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我无法打字输出整个事情.当然我不必写一个for循环?
我需要使用第一行和最后一行/列作为填充数据,在所有4个边上有效地填充numpy数组.例如,给出以下内容:
A=np.array([[1 2 3 4],
[5 6 7 8],
[9 10 11 12]])
Run Code Online (Sandbox Code Playgroud)
我想结束:
B=np.array([[1 1 2 3 4 4],
[1 1 2 3 4 4],
[5 5 6 7 8 8],
[9 9 10 11 12 12],
[9 9 10 11 12 12]])
Run Code Online (Sandbox Code Playgroud)
注意原始数组A位于:B [1:-1,1:-1].我假设我可以首先在一个方向(水平或垂直)填充,以获得重复的角点值.但是,我的矢量化/ numpification让我失望了.(注意:我正在使用的数组非常大,我需要多次执行此选项,因此有效地执行它是关键 - 我可以使用循环来完成它,但它很慢).
是否可以监控向量化操作的进度R?例如,在循环中总是if (i %% 10000) print(i)可以查看代码当前正在处理哪个元素。我的直觉是“可能不是”,但可能是我错了?
我有两个向量,比如A大小为nx1,B大小为1xm.我想C从非线性公式创建一个结果矩阵(nxm)
C(i,j) = A(i)/(A(i)+B(j)).
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过循环执行此操作,例如:
for i=1:n,
C(i,1:m)=A(i)./(A(i)+B(1:m));
end
Run Code Online (Sandbox Code Playgroud)
但是有可能在某种程度上不使用循环吗?
编辑:谢谢你的回答!作为一个小小的补充,在我看到它们之前,朋友提出了以下解决方案:
C = A*ones(1,m)./(ones(n,1)*B+A*ones(1,m))
Run Code Online (Sandbox Code Playgroud) 我已经定义了一个向量[0.11,1,3,4.5,7].我还有一个f具有值的函数[f(0.11),f(1),f(3),f(4.5),f(7)].与此同时,我有另一个可能没有固定长度的矢量.其价值和长度由用户决定.为简单起见,假设向量为[4,4.5,5,6].我想在编程中做如下:
f(4), f(4.5), f(5) and f(6)使用线性近似从给定数据输入获得近似值.
我明白我可以使用for循环来解决问题; 但我想知道for循环是否必要.有人可以想到一个不使用for循环的方法吗?
考虑数字的排序(升序)数组double。为了数值稳定,应该对数组求和,就好像从头到尾迭代一样,将总和累加到某个变量中。
如何使用AVX2有效地向量化?
我研究了此方法用AVX指令完成水平向量求和的最快方法,但是将其缩放为数组(可能需要一些分治法)似乎很棘手,同时通过确保小数来保持浮点精度在将它们添加到更大数量之前进行汇总。
澄清1:我认为应该可以将例如前4个项目相加,然后将它们添加到接下来4个项目的合计中,以此类推。但是我更喜欢一种不会完全破坏稳定性的方法。
澄清2:内存不应成为瓶颈,因为该阵列位于L3高速缓存中(但不应位于L1 / L2高速缓存中,因为该阵列的各个部分是从不同的线程填充的)。我不想求助于Kahan求和,因为我认为真正重要的是运算数量,而Kahan求和将使它增加约4倍。
我试图摆脱R中的循环,并期待矢量化和加速我的代码的一部分.
可重复的例子:
library(dplyr)
# This works using a For loop -----------------------------------
# create sample data frame
df <- data.frame(Date = rep(c("Jan1", "Jan2", "Jan3"), 3),
Item = c(rep("A", 3), rep("B", 3), rep("C", 3)),
Value = 10:18)
diff <- numeric() # initialize
# Loop through each item and take difference of latest value from earlier values
for (myitem in unique(df$Item)) {
y = df[df$Date == last(df$Date) & df$Item == myitem, "Value"] # Latest value for an item
x = df[df$Item == …Run Code Online (Sandbox Code Playgroud) 我正在使用_mm_extract_epi8 (__m128i a, const int imm8)函数,它有const int参数.当我编译此c ++代码时,收到以下错误消息:
错误C2057预期的常量表达式
__m128i a;
for (int i=0; i<16; i++)
{
_mm_extract_epi8(a, i); // compilation error
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在循环中使用这个功能?
假设我有一个循环,可以对数组做一些数学运算x。是在每次迭代中在循环内分配一个临时double还是更好,还是应该array[i]每次都使用?
更好的是,我的意思是使用C ++在性能方面。我想知道C ++是否破坏了某些矢量化或现金优化?
另外,如果我使用此数组调用函数,并且可能需要多次使用函数值,该怎么办,所以通常对函数也是如此。我认为这比多次调用该函数要好。
如果循环使用怎么样omp parallel,我认为这应该是安全的,正确的?
for(int i=0; i<N; i++){
double xi = X[i];
double fi = f(xi);
t[i] = xi*xi + fi + xi/fi;
}
Run Code Online (Sandbox Code Playgroud)