我想知道是否有人可以帮助我对这些循环进行矢量化我已经尝试了几次但是未能提前感谢.
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)
感谢您的任何帮助....
我想找到一种方法来替换我正在使用的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)
但是,这非常慢.有任何想法吗?谢谢!
我有一个数组数组.
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] > 40000和Test[i][1] + Test[i][2] < 350000
我显然可以遍历列表.但是当阵列数量巨大时,这将非常缓慢.
我如何以矢量化的方式做到这一点.
如果这会导致任何限制,我也使用JavaME.但JavaSE解决方案也是很有见地,并且希望在JavaME中工作.
给定一个矩阵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)
(或其他一些填充)
我怎么能得到这个?
我正在尝试使用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)
data 是一个数据帧mydist.fake并且d.hat.fake是距离矩阵(其中对角线为零并且上三角和下三角的值相同)因此,对下三角的横向感兴趣(也留下对角线的值).我有一个可能有数百万个3x3矩阵的数组.在不使用for循环的情况下,在MATLAB中水平连接它们的最快方法是什么?理想情况下,我想做这样简单的事情
[M(:,:,1) M(:,:,2) ... M(:,:,10000000)]
Run Code Online (Sandbox Code Playgroud) 我可能对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) 我有两个向量,A = [1,3,5]和B = [1,2,3,4,5,6,7,8,9,10].我想C=[2,4,6,7,8,9,10]通过提取一些元素B是A没有.
我不想使用循环,因为这是来自真实数据模拟的简化问题.在真实的情况下A,B是巨大的,但A包括在内B.
我有一个非常大的乘法和求和运算,我需要尽可能高效地实现.到目前为止我发现的最好的方法是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.
我有以下循环:
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来向量化此简单循环?