矢量化循环

tri*_*can 2 matlab image-processing vectorization

我想优化下面的代码,这只是一个矩阵乘法 - 我确信这可以在不使用循环的情况下完成 - 但我似乎无法将其弄好.

k = [ 76    150    29; ...
     -44   -85    128;  ...
     128   -108   -21];

for i = 1:size(rgb,1)
  for j = 1:size(rgb,2)
    triplet(1:3) = rgb(i,j,:);
    yuv(i,j,:)   = single(triplet) * single(k');
    yuv(i,j,:)   = fix(yuv(i,j,:) ./ 256);
  end
end
Run Code Online (Sandbox Code Playgroud)

有什么想法或建议吗?

对于那些具有图像处理背景的人来说,你会发现上面的代码只是一个RGB到YUV的转换 - 你可能会问我为什么不使用内置rgb2ycbcr函数 - 但是在这种情况下我想使用如上所述的8位转换系数.

use*_*775 6

您可以 reshape

rgbR = reshape( rgb, [], 3 );
yuvR = single(rgbR) * single( k' );
yuv = reshape( fix( yuvR./ 256 ), size(rgb,1), size(rgb,2), [] );
Run Code Online (Sandbox Code Playgroud)

PS,
最好不要在Matlab中使用ij作为变量名.