Я не могу помочь вам с этим 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])
относится к 27 элементам в массиве z
с индексами, которые являются декартовым произведением указанных индексов, а не 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