我是靠谱客的博主 拉长大米,这篇文章主要介绍matlab 的一个bug:for循环给矩阵赋值失败,现在分享给大家,希望可以做个参考。

文章目录

    • 现象1(单个例子)
    • 现象2(整体)
    • 代码
    • 进一步探究(简化代码,4*4矩阵作为图像)
    • 希望各位大佬能给予解释!谢谢

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

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

现象1(单个例子)

我是严重怀疑我用了一个假的matlab.出现了很多根本不该打印的东西。(打印的时候不要用G(i:j)而是temp)

在这里插入图片描述
用for循环跑出来的结果:(赋值失败,很多0)
在这里插入图片描述
在for循环外面跑的代码和结果:(赋值正确)
在这里插入图片描述
在这里插入图片描述
for循环把该有的都跑飞了。

现象2(整体)

矩阵赋值之后只有左边两列有数据,其他全0。
在这里插入图片描述

代码

如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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: %dn',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矩阵作为图像)

代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

这里我只创建了一个4x4的三维矩阵(我怀疑是元素太多,在计算过程中调用内存不够导致的失败,然而并不是),矩阵的值全为1。但是无论如何修改,单点赋值给单点就是不行(只有w个数被成功赋值)。结果如下
在这里插入图片描述
创建了一个4x3的三维矩阵,结果如下:
在这里插入图片描述

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

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

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

最后

以上就是拉长大米最近收集整理的关于matlab 的一个bug:for循环给矩阵赋值失败的全部内容,更多相关matlab内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(94)

评论列表共有 0 条评论

立即
投稿
返回
顶部