MATLAB矢量化
我想知道是否有人能帮我把这段代码矢量化 fr_bw是一个矩阵MATLAB矢量化,matlab,vectorization,Matlab,Vectorization,我想知道是否有人能帮我把这段代码矢量化 fr_bw是一个矩阵 for i=1:height for j=1:width [min_w, min_w_index] = min(w(i,j,:)); mean(i,j,min_w_index) = double(fr_bw(i,j)); sd(i,j,min_w_index) = sd_init; end end 我不能
for i=1:height
for j=1:width
[min_w, min_w_index] = min(w(i,j,:));
mean(i,j,min_w_index) = double(fr_bw(i,j));
sd(i,j,min_w_index) = sd_init;
end
end
我不能帮你处理这个
sif(match==0)
的东西——如果它应该是if(match==0)
你没有改变match
,所以它可以被带到循环之外
否则,这个怎么样:
[min_w, min_w_index] = min(w, [], 3);
r = repmat((1:height)',1,width);
c = repmat(1:width,height,1);
ind = sub2ind(size(w),r(:),c(:),min_w_index(:));
w_mean(ind) = double(fr_bw);
w_sd(ind) = repmat(sd_init,height,width);
(请注意,mean
是一个内置函数,因此我将变量重命名为w\u mean
和w\u sd
)
sub2ind
调用提供与下标相对应的线性索引。(直接下标不起作用;z([a1 a2 a3],[b1 b2 b3],[c1 c2 c3])
指的是z
数组中的27个元素,下标是指定下标的笛卡尔积,而不是您可能期望的z(a1,b1,c1)
和z(a2,b2,c2)
和z(a3,b3,c3)
。)
下面是此技术的一个示例:
>> height = 6; width = 4;
>> w = randi(1000,height,width,2)
w(:,:,1) =
426 599 69 719
313 471 320 969
162 696 531 532
179 700 655 326
423 639 408 106
95 34 820 611
w(:,:,2) =
779 441 638 696
424 528 958 68
91 458 241 255
267 876 677 225
154 519 290 668
282 944 672 845
>> [min_w, min_w_index] = min(w, [], 3);
>> min_w_index
min_w_index =
1 2 1 2
1 1 1 2
2 2 2 2
1 1 1 2
2 2 2 1
1 1 2 1
>> z = zeros(height,width,2);
>> r = repmat((1:height)',1,width);
>> c = repmat(1:width,height,1);
>> ind = sub2ind(size(w),r(:),c(:),min_w_index(:));
>> z(ind) = 1
z(:,:,1) =
1 0 1 0
1 1 1 0
0 0 0 0
1 1 1 0
0 0 0 1
1 1 0 1
z(:,:,2) =
0 1 0 1
0 0 0 1
1 1 1 1
0 0 0 1
1 1 1 0
0 0 1 0
关于您的代码的一些评论:
if
而不是sif
w
、fr\u bw
和sd\u init
的示例。这使得给出准确答案变得很棘手mean
的变量赋值。这会影响均值
功能,可能会让您感到悲伤double
;它们已经是正确的类型。(另一方面,如果fr\u bw
是另一种类型,比如整数,那么应该在循环之前创建一个新变量dbl\u fr\u bw=double(fr\u bw);
[min_w, min_w_index] = min(w, [], 3)
第二行
mean_values(:, :, min_w_index) = double(fr_bw)
我不确定第三行,因为我不知道sd_init是/做什么。fr_bw是一个矩阵还是函数?对不起,我是要添加它的。是的fr_bw是一个矩阵。谁会“-1”呢d这个问题请解释一下?这是一个合理的问题。你的第二行建议行不通。试试看。你会得到一个错误。也就是说,下标索引是独立的,不适用于值矩阵。除非所有的最小值索引值都相同,否则它指的是所有行和列以及所有最小值的并集的索引ndex值。这是一个平均值的三维切片,MATLAB希望右侧是一个大小合适的三维矩阵。@Jason S:接得好;删除了令人不快的线。我会听从你的回答。我可以发誓有办法做到你的建议(这也是我的第一个方法,直到它不起作用为止),但除了逻辑寻址之外,我什么都不知道。@Jason,@Richie谢谢你的回答这似乎不像for循环那样有效,我不确定为什么,但代码似乎产生了更好的性能,但没有产生正确的结果,你能看到任何原因吗?我已经删除了if语句。@Richie谢谢你的解释您的答案这似乎不像for循环那样有效,我不确定为什么,但代码似乎产生了更好的性能,但没有产生正确的结果,您能看到原因吗?如果没有更多关于您期望的内容的上下文/信息,我们无法诊断您遇到的问题。在w_我的意思是,这段代码运行了多次,似乎没有正确地更新。这段代码似乎是使用for循环发生的,这有助于解释这一点吗?除非你有我可以使用的示例数据,否则我无法复制它。