标签: vectorization

用于循环矢量化的matlab

我想知道是否有人可以帮助我对这些循环进行矢量化我已经尝试了几次但是未能提前感谢.

pixel_depth = 16; 
pixel_range = 2^pixel_depth -1;

for i=1:height

    for j=1:width

        for k=1:gaussianComponents

           mean(i,j,k) = rand*pixel_range; 

           weights(i,j,k) = 1/gaussianComponents; 

           pixelDeviation(i,j,k) = diviationNew; 

       end

    end

 end
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助....

matlab vectorization

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

替换for循环

我想找到一种方法来替换我正在使用的for循环.我的问题的快速版本是:我如何从矢量[a,b,c,d,e]转到[1,a,a*b,a*b*c,a*b*c*d]?我目前做的事情如下:

myvec <- c(.3,.5,.2,.3,.3)  
new_vec <- vector(length=length(myvec))  
new_vec[1] <- 1  
for (i in 2:length(myvec)) {  
    new_vec[i] <- myvec[i-1]*new_vec[i-1]  
}  
Run Code Online (Sandbox Code Playgroud)

但是,这非常慢.有任何想法吗?谢谢!

performance for-loop r vectorization

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

Java:获取符合条件的数组的子集

我有一个数组数组. float[][] Test

例如

  {  {433801.000f,335601.000f,5},
     {433821.000f,335631.000f,5},
     {433811.000f,335671.000f,5}  };
Run Code Online (Sandbox Code Playgroud)

如何获取此数组(或数组数组)的子集,其中值满足条件.

例如,在哪里Test[i][0] > 40000Test[i][1] + Test[i][2] < 350000

我显然可以遍历列表.但是当阵列数量巨大时,这将非常缓慢.

我如何以矢量化的方式做到这一点.

如果这会导致任何限制,我也使用JavaME.但JavaSE解决方案也是很有见地,并且希望在JavaME中工作.

java arrays vectorization java-me

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

如何对矩阵子集进行向量化,使find()返回一个矩阵?

给定一个矩阵A,我需要找到对应于值1和2的索引.我可以按如下顺序执行:

>> B

B =

     1     2     3
     4     1     6
     7     8     9
     4     5     1

>> find(B==1)

ans =

     1
     6
    12

>> find(B==2)

ans =

     5
Run Code Online (Sandbox Code Playgroud)

但是如果我在循环中进行这种操作,Matlab将只使用我的处理器的一个核心.我如何矢量化它,以便从中获取矩阵find?我想要这个结果:

>> my_find( B, [1 2] )

ans =

    1 5
    6 0
   12 0
Run Code Online (Sandbox Code Playgroud)

(或其他一些填充)

我怎么能得到这个?

matlab vectorization octave

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

嵌套for循环的矢量化

我正在尝试使用apply/ mapply/ lapply/ sapply或任何其他方式来矢量化我的嵌套for循环代码以减少运行时间.我的代码如下:

for (i in 1:dim){
 for (j in i:dim){ 
  if(mydist.fake[i,j] != d.hat.fake[i,j]){
    if((mydist.fake[i,j]/d.hat.fake[i,j] > 1.5)|(d.hat.fake[i,j]/mydist.fake[i,j]>1.5)){
        data1 = cbind(rowNames[i],rowNames[j], mydist.fake[i,j], d.hat.fake[i,j], 1)
        colnames(data1) = NULL
        row.names(data1) = NULL
        data = rbind(data, data1)
    }else{
        data1 = cbind(rowNames[i],rowNames[j], mydist.fake[i,j], d.hat.fake[i,j], 0)
        colnames(data1) = NULL
        row.names(data1) = NULL
        data = rbind(data, data1)
        }
      }
    }  
  }
write.table(data, file = "fakeTest.txt", sep ="\t", col.names = FALSE, row.names = FALSE)
Run Code Online (Sandbox Code Playgroud)
  • rowNames是所有数据点的rownames的向量
  • data 是一个数据帧
  • mydist.fake并且d.hat.fake是距离矩阵(其中对角线为零并且上三角和下三角的值相同)因此,对下三角的横向感兴趣(也留下对角线的值).
  • 两个矩阵的尺寸是相同的. …

r vectorization apply sapply

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

如何连接矩阵数组?

我有一个可能有数百万个3x3矩阵的数组.在不使用for循环的情况下,在MATLAB中水平连接它们的最快方法是什么?理想情况下,我想做这样简单的事情

 [M(:,:,1) M(:,:,2) ... M(:,:,10000000)]
Run Code Online (Sandbox Code Playgroud)

matlab matrix vectorization

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

数组每列中的唯一元素(Matlab)

我可能对Matlab有点生疏,也许这个问题的答案比我现在想象的更微不足道.但是我在网上搜索了有效的解决方案而我还没有找到,所以我会在这里试试.

我有一个大矩阵,类似于y:

N = 1e6; k = 20; n = 100;
y = ceil(n * rand(k, N));
Run Code Online (Sandbox Code Playgroud)

对于数组的每一列,我想计算唯一元素的数量.循环非常慢:

tic
r = zeros(N, 1);
for ii = 1:N
  r(ii) = numel(unique(y(:, ii)));
end
toc
Run Code Online (Sandbox Code Playgroud)

寻找矢量化,更快的版本.


大卫的回答似乎也是正确而快速的.谢谢!

N = 1e6; k = 20; n = 100;
y = ceil(n * rand(k, N));

tic
r1 = zeros(N, 1);
for ii = 1:N
  r1(ii) = numel(unique(y(:, ii)));
end
toc

tic
r2 = sum(diff(sort(y)) ~= 0) + 1;
toc

all(r1' == r2)
Run Code Online (Sandbox Code Playgroud)

arrays matlab element unique vectorization

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

从满足特定条件的向量中取出元素

我有两个向量,A = [1,3,5]B = [1,2,3,4,5,6,7,8,9,10].我想C=[2,4,6,7,8,9,10]通过提取一些元素BA没有.

我不想使用循环,因为这是来自真实数据模拟的简化问题.在真实的情况下A,B是巨大的,但A包括在内B.

performance matlab vector vectorization

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

MATLAB的bsxfun最好吗?Python的numpy.einsum?

我有一个非常大的乘法和求和运算,我需要尽可能高效地实现.到目前为止我发现的最好的方法是bsxfun在MATLAB中,我将问题表述为:

L = 10000;
x = rand(4,1,L+1);
A_k = rand(4,4,L);
tic
for k = 2:L
    i = 2:k;
    x(:,1,k+1) = x(:,1,k+1)+sum(sum(bsxfun(@times,A_k(:,:,2:k),x(:,1,k+1-i)),2),3);
end
toc
Run Code Online (Sandbox Code Playgroud)

请注意,L在实践中会更大.有更快的方法吗?奇怪的是,我需要首先添加单例维度x然后再添加sum它,但我不能让它工作.

它仍然比我尝试的任何其他方法快得多,但对我们的应用程序来说还不够.我听说过有关Python函数numpy.einsum可能更有效的传言,但我想在我考虑移植代码之前先问这里.

我正在使用MATLAB R2017b.

python arrays matlab vectorization bsxfun

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

我怎样才能让clang向量化一个简单的循环?

我有以下循环:

float* s;
float* ap;
float* bp;

... // initialize s, ap, bp

for(size_t i=0;i<64;++i) {
   s[i] = ap[i]+bp[i];
}
Run Code Online (Sandbox Code Playgroud)

似乎是矢量化的良好候选者。尽管我打开了优化功能,但是当我查看程序集输出时,clang(我正在使用Xcode)似乎没有向量化循环:

LBB33_1:                                ## =>This Inner Loop Header: Depth=1
    movss   (%rax,%rsi,4), %xmm0    ## xmm0 = mem[0],zero,zero,zero
    addss   (%rcx,%rsi,4), %xmm0
    movss   %xmm0, (%rdx,%rsi,4)
Ltmp353:
    incq    %rsi
Ltmp354:
    cmpq    $64, %rsi
Ltmp355:
    jne LBB33_1
Run Code Online (Sandbox Code Playgroud)

如何获得clang / Xcode来向量化此简单循环?

c sse vectorization clang compiler-optimization

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