Matlab索引超出数组元素的数目(4)求解答

img


% 使用混沌映射生成密钥
seed = input('请输入初始种子:');
n = input('请输入生成的随机数个数:');
x = zeros(n,1);
y = zeros(n,1);
z = zeros(n,1);
x(1) = seed(1);
y(1) = seed(2);
z(1) = seed(3);
for i = 2:n
    x(i) = 1 - 2*x(i-1)^2 + 0.1*y(i-1);
    y(i) = x(i-1);
    z(i) = 0.5 - 0.5*z(i-1);
end
% 将生成的密钥分成两部分,一部分用于像素置乱,一部分用于像素替换
key1 = [x y z];
key2 = randperm(n);
% 读入原始图像
img = imread('wpz.jpg');
% 将原始图像分割成多个小块
blockSize = input('请输入每个小块的大小:');
[h,w] = size(img);
hNum = floor(h / blockSize);
wNum = floor(w / blockSize);
blocks = cell(hNum, wNum);
for i = 1:hNum
    for j = 1:wNum
        blocks{i,j} = img((i-1)*blockSize+1:i*blockSize,(j-1)*blockSize+1:j*blockSize);
    end
end
% 遍历每个小块,进行像素置乱和像素替换
for i = 1:hNum
    for j = 1:wNum
        % 像素置乱
        block = blocks{i,j};
        [m,n] = size(block);
        % 使用初始种子和混沌映射生成随机数,用随机数进行像素位置的置换
        r = key1(i*j,:);
        r = (r - min(r)) / (max(r) - min(r));
        r = floor((n^2-1)*r) + 1;
        r = [1 r];
        for k = n:-1:2
            r(k) = r(k) + mod(r(k-1)-1,n-k+1);
            temp = r(k);
            r(k) = r(k-1);
            r(k-1) = temp;
        end
        % 进行像素位置的置换
        block = block(:,r);
        % 像素替换
        % 将每个小块的像素值进行替换,替换规则由密钥生成
        block = mod(block + key2(i*j), 256);
        % 将处理后的小块更新到blocks中
        blocks{i,j} = block;
    end
end
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7580488
  • 这篇博客你也可以参考下:matlab找到图像的最大连通区域
  • 除此之外, 这篇博客: Matlab图像显示中的 索引图像 重要 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在这里插入图片描述

    256种颜色
    0~255取值

    在这里插入图片描述
    返回了两个结果;数据矩阵,调色板矩阵,方括号分别存储

    读到了5,找到第五行,三个数值,就是颜色,自带调色板,这里5相当于色度矩阵的行数
    p所有数据点颜色的数目
    三列针对了:红 绿 蓝

  • 您还可以看一下 硬核野生技术咨询客服小李老师的matlab数学建模课程中的 逻辑与流程控制小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    该问题是因为你的索引超出了数组的范围,导致无法进行计算。解决该问题的方法是检查你的数组索引是否正确,并确保在计算前检查数组的大小。以下是具体步骤:

    1.检查数组大小:在Matlab中,您可以使用size()函数查看数组的大小,例如a = [1 2 3; 4 5 6];然后使用size(a)查看数组a的大小。因此,在进行计算之前,您应该检查数组大小是否正确。

    2.检查索引范围:通常,在Matlab中使用索引时,我们从1开始,对于多维数组,您可以使用逗号分隔符将索引值组合成一个索引向量,例如在二维数组中使用a(2,3)来获取a(2,3)的值。因此,在进行计算之前,请确保您的索引值在范围之内。

    3.使用条件语句检查索引:在处理数组时,可以使用条件语句来检查是否越界。通常,我们使用if语句来检查索引是否超出范围。例如:if index <= numel(a),则说明索引值不越界,可以进行计算;否则,程序将执行else分支返回错误信息。

    以下是一个具体的示例代码,演示了如何使用if语句检查索引:

    a = [1 2 3; 4 5 6]; m = 4; n = 4; if m <= size(a,1) && n <= size(a,2) value = a(m,n) + 1; else disp('Index out of range.'); end

    请注意,上面的代码将检查索引是否越界,如果越界,则输出“Index out of range”错误信息;否则将对数组执行加1操作,并且将结果存储在变量value中。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^