MATLAB矢量化

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 我不能

我想知道是否有人能帮我把这段代码矢量化

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

我不能帮你处理这个
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循环发生的,这有助于解释这一点吗?除非你有我可以使用的示例数据,否则我无法复制它。