MATLAB矢量化

时间:2011-05-04 11:46:09

标签: 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

2 个答案:

答案 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_meanw_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)

关于您的代码的一些评论:

  1. 您的意思是if而不是sif吗?

  2. 此时代码无法复制,因为您尚未提供变量wfr_bwsd_init的示例。这使得提供准确答案变得棘手。

  3. 看起来您正在将事物分配给名为mean的变量。这会影响mean功能,可能会让你感到悲伤。

  4. 我只是猜测,但我不认为double能做到你认为它做的事。您不需要将数字矩阵的各个元素转换为double类型;他们已经是正确的类型。 (另一方面,如果fr_bw是一个不同的类型,比如整数,那么你应该在循环之前创建一个新变量dbl_fr_bw = double(fr_bw);

  5. 您可能需要调整计算最小值的维度,但循环的第一行可以替换为

    [min_w, min_w_index] = min(w, [], 3)
    

    的第二行
    mean_values(:, :, min_w_index) = double(fr_bw)
    

    不确定第三行,因为我不知道sd_init是什么/