标签: vectorization

R - 向量化条件替换

嗨我正在尝试操作一个数字列表,我想这样做没有for循环,在R中使用快速本机操作.操作的伪代码是:

默认情况下,起始总数为100(对于零内的每个块)

从第一个零到下一个零,累计总数下降超过2%的时刻将所有后续数字替换为零.

在零之内完成所有数字块

累积总和每次都重置为100

例如,如果以下是我的数据:

d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);
Run Code Online (Sandbox Code Playgroud)

结果将是:

0 0 0 1 3 4 5 -1 2 3 -5 0 0 0 -2 -3 0 0 0 0 0 -1 -1 -1 0
Run Code Online (Sandbox Code Playgroud)

目前我有一个for循环的实现,但由于我的向量很长,性能很糟糕.

提前致谢.

这是一个运行的示例代码:

d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);
ans <- d;
running_total <- 100;
count <- 1;
max <- 100;
toggle <- FALSE;
processing <- FALSE;

for(i in d){
  if( i != 0 ){  
       processing <- TRUE; 
       if(toggle == TRUE){
          ans[count] = 0;  
       }
       else{
         running_total = …
Run Code Online (Sandbox Code Playgroud)

logic for-loop r vectorization conditional-statements

2
推荐指数
1
解决办法
588
查看次数

在没有for循环的情况下更改矩阵的多个元素(已知坐标)

我有一个矩阵说

Z = [1 2 3;
     4 5 6;
     7 8 9]
Run Code Online (Sandbox Code Playgroud)

我必须将其值(例如位置(2,2)和(3,1))更改为某个指定值.我有两个矩阵rowNoscolNos含有这些位置:

rowNos = [2, 3]
colNos = [2, 1]
Run Code Online (Sandbox Code Playgroud)

假设我想将这些位置的元素值更改为0.

如何在不使用for循环的情况下完成它?

matlab vectorization

2
推荐指数
1
解决办法
5697
查看次数

加快重复的函数调用

我正在尝试计算以下值:

1/N * sum[i=0 to N-1]( log(abs(r_i - 2 * r_i * x_i)) )
Run Code Online (Sandbox Code Playgroud)

其中x_i以递归方式计算:

x_{i+1} = r_i * x_i * (1 - x_i)
Run Code Online (Sandbox Code Playgroud)

r_i给出所有s的情况下(尽管它们随之变化i),并且x_0给出了.(据我所知,没有一种棘手的数学方法可以将这种计算简化为非迭代公式,以加快它的速度).

我的问题是它很慢,我想知道一些外部视角是否可以帮助我加快速度.

# x0: a scalar. rs: a numeric vector, length N
# N: typically ~5000
f <- function (x0, rs, N) {
    lambda <- 0                                                                 
    x <- x0                                                                     
    for (i in 1:N) {                                                            
        r <- rs[i]                                                              
        rx <- r * x                                                             
        lambda <- lambda + …
Run Code Online (Sandbox Code Playgroud)

r vectorization

2
推荐指数
1
解决办法
148
查看次数

比较R中的多维列表

我有以下两个清单:

First list:
[[1]]
[1] "ab" "iew"  "rer" "fdd"     
[[2]]
[1] "ff" "de 
[[3]]
[1] "cc"

Second list:
[[1]]
[1] "iew" "vfr" 
[[2]]
[1] "ff" "cdc"
[[3]]
[1] "vf" "cde"
Run Code Online (Sandbox Code Playgroud)

我的目标是比较这两个多维列表,结果将是:

[[1]]
[1] FALSE TRUE FALSE FALSE 
[[2]]
[1] TRUE FALSE
[[3]]
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

预先形成此intersect()函数的最佳矢量化方法是什么?

r vectorization

2
推荐指数
1
解决办法
71
查看次数

你将如何从这个matlab代码中删除循环

鉴于我们有:

  • x是2d矩阵,大小为[numSamples x numFeatures]
  • A是2d方形矩阵,大小为[numFeatures x numFeatures]
  • B是1d向量,大小为[1 x numFeatures]

我想在没有循环的情况下评估以下代码:(或以更快的方式)

out = zeros(1,numSamples);
for i = 1:numSamples
    res = sum(repmat(B - x(i,:), numSamples, 1)*A.*(x - repmat(x(i,:), numSamples, 1)), 2).^2;
    out(i) = var(res);
end
Run Code Online (Sandbox Code Playgroud)

如果您对更快地改进上述内容有其他建议,那也非常受欢迎.

matlab vectorization

2
推荐指数
1
解决办法
63
查看次数

通过旋转矩阵阵列旋转矢量数组

如果我们有一个3 x 3旋转矩阵R,它可以乘以v一个3 x N数组 - 一个N列向量数组- 来产生一个新3 x N的旋转向量数组,如下所示:

v_rotated = R.dot(v)
Run Code Online (Sandbox Code Playgroud)

现在假设我们有一个N x M x 3数组,N时间M向量,我想用N不同的3 x 3旋转矩阵旋转(向量的每个"行"一个旋转矩阵).这对循环来说很简单,但是有一种更快,更紧凑(矢量化)的方法,例如使用numpy's dottensorproduct

循环实现的示例代码:

from numpy import cos, sin, array, pi, linspace, random

# 100 different rotation matrices:
R = [array([[1, 0, 0], [0, cos(theta), -sin(theta)], [0, sin(theta), cos(theta)]]) for theta in linspace(0, pi, 100)] …
Run Code Online (Sandbox Code Playgroud)

python numpy vectorization scipy

2
推荐指数
1
解决办法
390
查看次数

NumPy vectorize()或dot()出现错误

在下面的代码中,y1和y2应该相等,但它们不是.vectorize()或dot()中可能有错误吗?

import numpy as np
interval = np.arange(0, 30, 0.1)
y1 = [- 1.57 * max(0, x - 10) - 0.72 * max(0, 15 - x)
      - 1.09 * max(0, 20 - x) for x in interval]

def fun(x, pivot, truth):
    if truth: return max(0, x - pivot)
    else:     return max(0, pivot - x)

pivots = [10, 15, 20]
truths = [ 1,  0,  0]
coeffs = [-1.57, -0.72, -1.09]
y2 = [np.dot(np.vectorize(fun)(x, pivots, truths), coeffs) for x in interval] …
Run Code Online (Sandbox Code Playgroud)

types numpy vectorization

2
推荐指数
1
解决办法
153
查看次数

具有相同标签的列的平均值

我有两个向量

data vector: A = [1 2 2 1 2 6; 2 3 2 3 3 5]
label vector: B = [1 2 1 2 3 NaN]
Run Code Online (Sandbox Code Playgroud)

我想取所有具有相同标签的列的平均值,并将它们输出为按标签号排序的矩阵,忽略NaN.所以,在这个例子中我想要:

labelmean(A,B) = [1.5 1.5 2; 2 3 3]
Run Code Online (Sandbox Code Playgroud)

这可以通过像这样的for循环来完成.

function out = labelmean(data,label)
out=[];
for i=unique(label)
    if isnan(i); continue; end
    out = [out, mean(data(:,label==i),2)];
end 
Run Code Online (Sandbox Code Playgroud)

但是,我正在处理包含许多数据点和标签的巨大数组.此外,此代码段将经常执行.我想知道是否有更有效的方法来做到这一点,而不是遍历每个单独的标签.

optimization matlab vector vectorization mean

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

有没有机会用SIMD加速重复代码?

考虑以下代码,其中a是一个参数数组,float并且s是一个最初未初始化的结果数组float:

s[n - 1] = mu * a[n - 1];
for (int j = n - 2; j >= 0; j--)
    s[j] = mu * (a[j] + s[j + 1]);
return s;
Run Code Online (Sandbox Code Playgroud)

有没有机会用SIMD(AVX2)改善这种重复代码的性能?

编辑:我后来发现这个公式/算法被称为"折扣金额",但无法在互联网上找到它的并行版本.

c++ performance simd vectorization avx2

2
推荐指数
1
解决办法
173
查看次数

如何在熊猫数据帧中向量化比较?

我有一部分数据框df是这样的:

| nr | Time | Event |
|----|------|-------|
| 70 | 8    |       |
| 70 | 0    |       |
| 70 | 0    |       |
| 74 | 52   |       |
| 74 | 12   |       |
| 74 | 0    |       |
Run Code Online (Sandbox Code Playgroud)

我想将事件分配到最后一列。默认情况下,第一个条目是1。

If Time[i] < 7 and nr[i] != nr[i-1], then Event[i]=Event[i-1]+1. 

If Time[i] < 7 and nr[i] = nr[i-1], then Event[i]=Event[i-1]

If Time[i] > 7 then Event[i]=Event[i-1]+1. 
Run Code Online (Sandbox Code Playgroud)

如何有效地向量化?我想避免循环。

python vectorization pandas

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