matlab 的一个bug:for循环给矩阵赋值失败

  • Post author:
  • Post category:其他


版本:matlab 2019a

现象:嵌套两层for循环,对图像的行列依次点对点赋值给另一个矩阵,只有w个数据成功赋值,其余全为0。

这里并不是无聊而是确实有场景需要用到点对点的赋值+运算。



现象1(单个例子)

我是严重怀疑我用了一个假的matlab.出现了很多根本不该打印的东西。(

打印的时候不要用G(i:j)而是temp

)

在这里插入图片描述

用for循环跑出来的结果:(赋值失败,很多0)

在这里插入图片描述

在for循环外面跑的代码和结果:(赋值正确)

在这里插入图片描述

在这里插入图片描述

for循环把该有的都跑飞了。



现象2(整体)

矩阵赋值之后只有左边两列有数据,其他全0。

在这里插入图片描述



代码

如下:

clc;
clear all ;
RGB = imread('1.jpg') ;
sz = size(RGB);
h = sz(1);
w = sz(2);
R =RGB ( : ,: ,1) ;% h,w故i=h,j=w(先行再列)
G =RGB ( : ,: ,2) ;
B =RGB ( : ,: ,3) ;

ro = uint8(zeros(h,w));
go = uint8(zeros(h,w));
bo = uint8(zeros(h,w));
image =  uint8(zeros(h, w, 3));
%将RGB转到两个8bit的outdata变量里去。
for i = 1:h 
    for j = 1: w
        ro(i:j) = R(i,j);
        go(i:j) = G(i,j);
        bo(i:j) = B(i,j);
%         ro(i:j) = bitand(R(i,j),255);
%         temp=bitand(R(i,j),255);
%         temp2=ro(i:j);
%         fprintf('i:%d j: %d\n',i,j); 
%         fprintf('bitand= %d,ro = %d \n',temp,temp2); 
    end
end
rgb = cat(3,ro,go,bo);
imshow(rgb);

imshow(RGB)可以得到正常的图像,imshow(rgb)就只能得到左侧(最左两列有一点信号)的黑色图像。



进一步探究(简化代码,4*4矩阵作为图像)

代码如下:

clear all ;
RGB = uint8(ones(4, 4, 3));
sz = size(RGB);
h = sz(1);
w = sz(2);
R =RGB ( : ,: ,1) ;% h,w故i=h,j=w(先行再列)
G =RGB ( : ,: ,2) ;
B =RGB ( : ,: ,3) ;
ro = uint8(zeros(h,w));
go = uint8(zeros(h,w));
bo = uint8(zeros(h,w));

for i = 1:h 
    for j = 1: w
        [i,j];
        temp=R(i,j);
        ro(i:j) =temp;
%         ro(i:j) = R(i,j);
        go(i:j) = G(i,j);
        bo(i:j) = B(i,j);
    end
end

这里我只创建了一个4×4的三维矩阵(我怀疑是元素太多,在计算过程中调用内存不够导致的失败,然而并不是),矩阵的值全为1。但是无论如何修改,单点赋值给单点就是不行(

只有w个数被成功赋值

)。结果如下

在这里插入图片描述

创建了一个4×3的三维矩阵,结果如下:

在这里插入图片描述

所以到目前感觉和w(内循环的次数)有关。

使用rgb=RGB,ro将得到正常的值(全1)。



希望各位大佬能给予解释!谢谢



版权声明:本文为qq_44404407原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。