matlab for循环坑

2023-11-17

matlab 用 for 嵌套循环遍历数组时,可能有 bug。matlab/octave 环境:

  • linux:Matlab R2018a [1]
  • windows:GNU Octave, version 5.2.0

for x = vector 的形式遍历,有下面几种情况:

  • 遍历行向量元素,OK;
  • 遍历列向量元素,OK;
  • 嵌套:外行内列,出事:外遍历行正常,内遍历列每次都是一次赋整列;
  • 嵌套:外列内行,出事:外遍历列起初不涉及嵌套 for 时正常,在内循环里再获取列就是整列;而内遍历行正常;
  • 嵌套:外行内行,OK;
  • 嵌套:外列内列,出事:外遍历列起初不涉及嵌套 for 时正常,在内循环里再获取列就是整列;而内遍历列也是整列;

详见代码、注释和输出:

clear all; clc;

a = [1 2 3];  % 行向量
fprintf("a size: [%s]\n", num2str(size(a)));
fprintf("single loop a\n");
for i = a
    fprintf("i: %d\n", i);  % OK
end

b = [4; 5; 6];  % 列向量
fprintf("b size: [%s]\n", num2str(size(b)));
fprintf("single loop b\n");
for i = b
    fprintf("i: %d\n", i);  % OK
end

fprintf("nested loop: row->col\n");
for ia = a
    fprintf("--- a: %d\n", ia);  % OK
    for ib = b
        fprintf("a: %s, b: [%s], %s\n", num2str(ia), num2str(size(ib)), num2str(ib));  % ia OK,ib 整列
    end
end

fprintf("nested loop: col->row\n");
for ib = b
    fprintf("--- b: %d\n", ib);  % OK
    for ia = a
        fprintf("b: %s, a: [%s], %s\n", num2str(ib), num2str(size(ia)), num2str(ia));  % ib 整列,ia OK
    end
end

fprintf("nested loop: row->row\n");
for ia = a
    fprintf("--- a: %d\n", ia);  % OK
    for ia2 = a
        fprintf("a: %s, a2: [%s], %s\n", num2str(ia), num2str(size(ia2)), num2str(ia2));  % OK
    end
end

fprintf("nested loop: col->col\n");
for ib = b
    fprintf("--- b: %d\n", ib);  % OK
    for ib2 = b
        fprintf("b: %s, b2: [%s], %s\n", num2str(ib), num2str(size(ib2)), num2str(ib2));  % ib、ib2 都是整列
    end
end

fprintf("nested loop: row->row->row\n");
c = [7, 8, 9];
for ia = a
    fprintf("a: [%s], %d\n", num2str(size(ia)), ia);  % OK
    for ib = b'  % 换成行
        fprintf("|- b: [%s], %d\n", num2str(size(ib)), ib);  % OK
        for ic = c
            fprintf("|- |- c: [%s], %d\n", num2str(size(ic)), ic);  % OK
        end
    end
end
  • 输出
a size: [1  3]
single loop a
i: 1
i: 2
i: 3

b size: [3  1]
single loop b
i: 4
i: 5
i: 6

nested loop: row->col
--- a: 1
a: 1, b: [3  1], 456
--- a: 2
a: 2, b: [3  1], 456
--- a: 3
a: 3, b: [3  1], 456

nested loop: col->row
--- b: 4
--- b: 5
--- b: 6
b: 456, a: [1  1], 1
b: 456, a: [1  1], 2
b: 456, a: [1  1], 3

nested loop: row->row
--- a: 1
a: 1, a2: [1  1], 1
a: 1, a2: [1  1], 2
a: 1, a2: [1  1], 3
--- a: 2
a: 2, a2: [1  1], 1
a: 2, a2: [1  1], 2
a: 2, a2: [1  1], 3
--- a: 3
a: 3, a2: [1  1], 1
a: 3, a2: [1  1], 2
a: 3, a2: [1  1], 3

nested loop: col->col
--- b: 4
--- b: 5
--- b: 6
b: 456, b2: [3  1], 456

nested loop: row->row->row
a: [1  1], 1
|- a: 1, b: [1  1], 4
|- |- a: 1, b: 4, c: [1  1], 7
|- |- a: 1, b: 4, c: [1  1], 8
|- |- a: 1, b: 4, c: [1  1], 9
|- a: 1, b: [1  1], 5
|- |- a: 1, b: 5, c: [1  1], 7
|- |- a: 1, b: 5, c: [1  1], 8
|- |- a: 1, b: 5, c: [1  1], 9
|- a: 1, b: [1  1], 6
|- |- a: 1, b: 6, c: [1  1], 7
|- |- a: 1, b: 6, c: [1  1], 8
|- |- a: 1, b: 6, c: [1  1], 9
a: [1  1], 2
|- a: 2, b: [1  1], 4
|- |- a: 2, b: 4, c: [1  1], 7
|- |- a: 2, b: 4, c: [1  1], 8
|- |- a: 2, b: 4, c: [1  1], 9
|- a: 2, b: [1  1], 5
|- |- a: 2, b: 5, c: [1  1], 7
|- |- a: 2, b: 5, c: [1  1], 8
|- |- a: 2, b: 5, c: [1  1], 9
|- a: 2, b: [1  1], 6
|- |- a: 2, b: 6, c: [1  1], 7
|- |- a: 2, b: 6, c: [1  1], 8
|- |- a: 2, b: 6, c: [1  1], 9
a: [1  1], 3
|- a: 3, b: [1  1], 4
|- |- a: 3, b: 4, c: [1  1], 7
|- |- a: 3, b: 4, c: [1  1], 8
|- |- a: 3, b: 4, c: [1  1], 9
|- a: 3, b: [1  1], 5
|- |- a: 3, b: 5, c: [1  1], 7
|- |- a: 3, b: 5, c: [1  1], 8
|- |- a: 3, b: 5, c: [1  1], 9
|- a: 3, b: [1  1], 6
|- |- a: 3, b: 6, c: [1  1], 7
|- |- a: 3, b: 6, c: [1  1], 8
|- |- a: 3, b: 6, c: [1  1], 9

用下标的方式遍历更稳,但当遍历矩阵、高阶张量时要注意在其余维度加 : 表示全取(见 [2]):

clear all; clc;

a = [1 2 3];  % 行
b = [4; 5; 6];  %for ia = 1 : length(a)  % 下标
    xa = a(ia);
    for ib = 1 : length(b)  % 下标
        xb = b(ib);
        fprintf("a: %d, b: %d\n", xa, xb);  % OK
    end
end

c = reshape(1 : 12, 3, 4);  % 矩阵
for ic = 1 : size(c, 1)  % 下标
    d = c(ic);  % 第二维没加 `:`,出事:只能拿到第一列
    e = c(ic, :);  % 第二维加 `:`,OK
    fprintf("d: %d\n", d);
    fprintf("e:"), disp(e);
end
  • 输出
a: 1, b: 4
a: 1, b: 5
a: 1, b: 6
a: 2, b: 4
a: 2, b: 5
a: 2, b: 6
a: 3, b: 4
a: 3, b: 5
a: 3, b: 6

d: 1
e:     1     4     7    10

d: 2
e:     2     5     8    11

d: 3
e:     3     6     9    12

References

  1. docker命令行安装matlab R2018a、matconvnet、gpu环境
  2. matlab、numpy的indexing差异
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab for循环坑 的相关文章

  • matlab中的分箱

    我一直无法在 matlab 或 Octave 中找到函数来完成我想要的操作 我有一个两列的矩阵 m x 和 y 值 我知道我可以通过执行 m 1 或 m 2 来提取列 我想将其分成 可能 大小相等的较小矩阵 并绘制这些矩阵的平均值 换句话说
  • 在不同长度的数组中查找相同的日期时间

    考虑以下儒略日期数组 Jday1 datenum 2011 01 01 00 00 yyyy mm dd HH MM 60 60 24 datenum 2011 12 31 23 00 yyyy mm dd HH MM Jday2 date
  • Windows 上 Matlab 64 位版本的免费 SCM [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当 Matlab 安装为 64 位版本时 它只能使用 64 位源代码控制系统 是否有免费的源代码控制系统
  • 同时使用两个数组中的元素的过滤器

    假设我们有两个大小相同的数组 A and B 现在 我们需要一个过滤器 对于给定的掩码大小 从以下位置选择元素A 但删除掩码的中心元素 并在其中插入相应的元素B 所以 3x3 伪掩码 看起来类似于 A A A A B A A A A 对平均
  • 计算向量中连续 1 和 0 的数量

    在 Matlab 中我有一个如下所示的向量 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 我现在要做的是统计这个向量中1的个数 连续的 1 算作 1 此外 我还想计算 1 之间 0 的平均值和中
  • 从彩色背景中提取黑色对象

    人眼很容易辨别black来自其他颜色 但是计算机呢 我在普通的A4纸上打印了一些色块 由于组成彩色图像有青色 品红色和黄色三种墨水 所以我设置每个块的颜色C 20 C 30 C 40 C 50 以及其余两种颜色是 0 这是我的源图像的第一列
  • 我的 matlab 图中需要不同的颜色

    这是我的情节代码 问题是我的图中的两条线具有相同的颜色 我需要为图中的每条线 总共 4 条线 分配一个特殊的颜色 for i 1 nFolderContents data hdrload folderContents i if size f
  • 正确重载 stringbuf 以替换 MATLAB mex 文件中的 cout

    MathWorks 目前不允许您使用cout当 MATLAB 桌面打开时 从 mex 文件中读取 因为它们已重定向 stdout 他们当前的解决方法是提供一个函数 mexPrintf 他们要求你改用 http www mathworks c
  • Matlab 中二维插值的函数形式

    我需要从二维数据数组构造一个插值函数 我需要返回实际函数的东西的原因是 我需要能够将函数作为我需要进行数值积分的表达式的一部分进行计算 因此 interp2 并没有解决这个问题 它不返回函数 我可以使用 TriScatteredInterp
  • 如何在matlab中绘制彩色一维直方图

    我有一个一维数组 X 其中包含相关系数的统计数据 我想绘制一个彩色直方图 我使用以下代码 histogram X 10 它可以创建具有单色的直方图 现在我想绘制一个直方图 其中每个条形都有不同的颜色 但 FaceColor 选项只能调整整个
  • 数组中 2 个百分位之间的平均元素

    我有 2 个长度为 200 的向量 例如 A 和 B 然后我使用以下方法找到数组 A 的每第二个百分位数 A1 prctile A 1 2 100 1 这样A1是一个长度为50的数组 现在我想找到A1中每两个元素内的A元素的平均值 即A的第
  • 是否有一个函数可以将两个元胞数组“压缩”在一起? [复制]

    这个问题在这里已经有答案了 假设我有一个元胞数组A and B as so A A B C D B 1 2 3 4 我想创建元胞数组C通过将 A 和 B 压缩 在一起 如下所示 C zip A B C A 1 B 2 C 3 D 4 这样的
  • 如何使用Matlab提高PSD的分辨率

    我有音频信号 我用 Matlab 读取该信号 并使用 pwelch 获取其 PSD 这是我正在使用的代码 x Fs audioread audioFile wav x x 1 mono xPSD f pwelch x hamming 512
  • 在 matlab/octave 中将数据集分成两个子集 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 将数据集分为两个子集 例如 训练 和 测试 其中 训练集包含 80 的数据 测试集包含剩余的 20 分裂的意思是生成一个长度等于的逻辑索引
  • MATLAB 中的抗锯齿线和标记

    您好 我在 MATLAB 中有一张图像 我希望这条线是平滑的 看看从 0 4 到 0 8 的线 这太可怕了 当在图中使用 LineSmoothing on 运算符时 我得到了这个 我在线条上做得很好 但它也使标记变得平滑 而且它们太可怕了
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • 在 MATLAB 中将数据拟合到 B 样条

    我正在尝试估计矩阵形式的时间序列数据中的缺失值 列代表时间点 即现在 我想将矩阵的每一行拟合到 B 样条曲线 并用它来估计缺失值 我可以使用 MATLAB 将数据拟合到普通样条曲线 但我完全陷入尝试找出如何拟合数据以创建 B 样条曲线的困境
  • 将单元格转换为双精度

    gt gt C 1 2 CF 2 C 1 2 CF 2 gt gt whos C Name Size Bytes Class Attributes C 2x2 478 cell 我怎样才能转换C into double以便 gt gt C
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • 如何获取活动对象 MATLAB GUI 的句柄

    我正在尝试使用 MATLAB GUI 创建日历 我有两个Edit Text对象 edittext1 and edittext2 我想做这个 我把光标放在edittext1然后在日历中选择日期 它会进入文本字段edittext1 同样对于ed

随机推荐

  • ArrayList源码解析(一)

    以下分析均以jdk1 8为准 首先来看一下ArrayList的继承体系 ArrayList继承自AbstractList 实现了 List Cloneable Serializable RandomAccess接口 这一点从源码上也可以看到
  • 达梦数据库教程:DM8数据迁移工具使用教程(oracle迁移至DM8)

    DM 数据迁移工具 DM 数据迁移工具 DM DTS 提供了主流大型数据库迁移到 DM DM 到 DM 文件迁移到 DM 以及 DM 迁移到文件等功能 得益于 DM 数据库对目前主流大型关系型数据库系统有着业界领先的兼容性 在存储层面 语法
  • 机器学习——seaborn可视化

    主要记录seaborn可视化学习笔记 明白有哪些绘制图像的函数可用 文章目录 一 seaborn原理 二 变量分布 1 sns boxplot 查看数值变量的取值范围 2 sns displot 查看变量的分布 3 sns jointplo
  • Windows Server存储空间配置及文件服务器的搭建

    Windows Server存储空间配置及文件服务器的搭建 技术参考 存储空间配置及文件服务器的搭建 pdf 一 网络拓扑图 环境准备 基础环境级上次实验结束后环境 上次实验 这里的共享存储就使用DC服务器 基础环境的准备 文件服务器 DC
  • BinaryWatch[LeetCode]

    class Solution public vector
  • Python 直接赋值、浅拷贝和深度拷贝解析

    Python 直接赋值 浅拷贝和深度拷贝解析 一 直接赋值 直接赋值其实就是对象的引用 别名 比如 b a 把a的值赋给b b就相当于一个别名 其实a和b都是指向的同一对象 下图很清晰地说明了直接赋值的含义 二 浅拷贝 copy 与 深度拷
  • 2023年1月计划(fbo+qedl)

    根据规划 1月计划如下 剩下还有20天 主要把fbo搞定就行了 也把qedl抄几遍 当然 能移植到osg中更好 看看glsl和osg相关的视频教程和书籍 ue4和socket可以在周末学学
  • 机器人 串口配置文件serial.INI

    SERIAL INI Configuration of the serial ports and their protocols Lindemann 27 02 2002 KUKA Controls update comments and
  • MFC-编写JAVA环境变量配置发现的问题

    配置JAVA环境变量实际上是要修改系统的环境变量 MSDN中有许多修改环境变量的函数 调用比如SetEnvironmentVariable 这样的环境变量设置函数 都是无法修改系统的环境变量的 只能改变本进程的环境变量 要修改系统环境变量只
  • Blender小图标栏不见

    将鼠标放置于属性面板左上角的 gt 箭头上 按住鼠标左键 向右拉 可能会操作到两个窗口边界 需要多操作几次
  • 并 发 请 求

    如果一次性 就加载100个请求 肯定会造成服务器压力 所以有时候 需要 较少请求 来减轻服务器压力 代码如下 const urls for let i 0 i lt 100 i urls push http www bai com i fu
  • css flex布局 —— 容器属性 flex-wrap

    flex wrap属性 默认情况下 项目都排在一条线 又称 轴线 上 flex wrap属性定义 如果一条轴线排不下 如何换行 语法 box flex wrap nowrap wrap wrap reverse flex wrap 取值有三
  • Eureka与Zookeeper的区别

    著名的CAP 理论指出 一个分布式系统不可能同时满足 C 一致性 A 可用性 和 P 分区容错性 由于分区容错性在是分布式系统中必须要保证的 因此我们只能在 A 和 C 之间进行权衡 在此 Zookeeper 保证的是 CP 而 Eurek
  • mysql数据库中的索引有那些、有什么用

    转载http www 2cto com database 201212 173288 html mysql 数据库中的索引有那些 有什么用 本文主要讲述了如何加速动态网站的MySQL索引分析和优化 www 2cto com 一 什么是索引
  • Rocksdb 代码学习 写流程1(WriteBatch写,WriterThead调度Writer)

    1 几个需要使用的相关类 1 Slice 主要用来装数据的 就两个成员变量data size 就是用装key和value的值 长度 以及一些处理函数 class Slice public Create an empty slice Slic
  • 文件上传到s3服务器,如何将文件从远程服务器传输到我的Amazon S3实例?

    1 带密钥的SSH sh keygen f ssh id rsa q P cat ssh id rsa pub 将此SSH密钥放入 ssh authorized keys文件 mkdir ssh chmod 0700 ssh touch s
  • spring事务(注解 @Transactional )失效的12种场景

    文章目录 一 事务不生效 七种 1 访问权限问题 只有public方法会生效 2 方法用final修饰 不会生效 3 同一个类中的方法直接内部调用 会导致事务失效 3 1 新加一个Service方法 3 2 在该Service类中注入自己
  • WPS显示无法创建对象,请确认对象已在系统注册表中注册

    写论文想插公式发现没法插入了 注册表又不知道改哪个 所以干脆 1 卸载WPS 不保留信息 2 选择另一个不同的路径重新安装即可
  • java中的数据加密

    记录 一 java中的数据加密 Java提供的安全模型和API 加密基础知识 使用JAVA实现加密 二 Java提供的安全模型和API 2 1 Java语言本身的安全性 自动内存管理 对于生成的对象在生命周期结束后会自动销毁 自动数组溢出检
  • matlab for循环坑

    matlab 用 for 嵌套循环遍历数组时 可能有 bug matlab octave 环境 linux Matlab R2018a 1 windows GNU Octave version 5 2 0 以 for x vector 的形