我想知道是否有人可以帮助我对这段代码进行矢量化。
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
答案 0 :(得分:1)
我无法帮助您处理这些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_mean
和w_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
答案 1 :(得分:0)
关于您的代码的一些评论:
您的意思是if
而不是sif
吗?
此时代码无法复制,因为您尚未提供变量w
,fr_bw
和sd_init
的示例。这使得提供准确答案变得棘手。
看起来您正在将事物分配给名为mean
的变量。这会影响mean
功能,可能会让你感到悲伤。
我只是猜测,但我不认为double
能做到你认为它做的事。您不需要将数字矩阵的各个元素转换为double
类型;他们已经是正确的类型。 (另一方面,如果fr_bw
是一个不同的类型,比如整数,那么你应该在循环之前创建一个新变量dbl_fr_bw = double(fr_bw);
。
您可能需要调整计算最小值的维度,但循环的第一行可以替换为
[min_w, min_w_index] = min(w, [], 3)
mean_values(:, :, min_w_index) = double(fr_bw)
不确定第三行,因为我不知道sd_init
是什么/