精华内容
下载资源
问答
  • 多重for循环怎么理解
    千次阅读
    2021-04-20 05:51:28

    function test

    clear;clc;

    N1=3;N2=4;N3=5; N4=2;

    M1=6;M2=7;M3=9; M4=8;

    Q_n1_n2_n3_n4_2=cat(5,randi(50,N1,N2,N3,N4),randi(50,N1,N2,N3,N4)); % 把Q1,Q3扩展到第5维

    Q_m1_m2_m3_m4_2=cat(5,randi(50,M1,M2,M3,M4),randi(50,M1,M2,M3,M4)); % 把Q2,Q4扩展到第5维

    n1_m1=randi(50,N1,M1);

    n2_m2=randi(50,N2,M2);

    n3_m3=randi(50,N3,M3);

    % --------------------  使用"for循环"的方法(灵活,可读性好) -------------------------

    tic

    F_n4_m4=zeros(N4,M4);

    for n1=1:N1 ,for m1=1:M1

    for n2=1:N2, for m2=1:M2,

    for n3=1:N3, for m3=1:M3

    for n4=1:N4, for m4=1:M4

    F_n4_m4(n4,m4)=F_n4_m4(n4,m4)+ ...

    n1_m1(n1,m1)*n2_m2(n2,m2)*n3_m3(n3,m3)* ...

    (Q_n1_n2_n3_n4_2(n1,n2,n3,n4,1)*Q_m1_m2_m3_m4_2(m1,m2,m3,m4,1)+ ...

    Q_n1_n2_n3_n4_2(n1,n2,n3,n4,2)*Q_m1_m2_m3_m4_2(m1,m2,m3,m4,2));

    end;end;end;end;end;end;end;end

    toc

    disp(F_n4_m4)

    % --------------- 下面是不用"for循环"的高维矩阵运算(快速,可读性差) ------------------

    tic

    n1_l_l_m1=reshape(n1_m1,N1,1,1,M1); % N1*1*1*M1

    n2_l_l_m2=reshape(n2_m2,N2,1,1,M2); % N2*1*1*M2

    n3_l_l_m3=reshape(n3_m3,N3,1,1,M3); % N3*1*1*M3

    Q_n1_n2_n3_1_1_1_n4_2=reshape(Q_n1_n2_n3_n4_2,N1,N2,N3,1,1,1,N4,2); % N1*N2*N3*1*1*1*N4*2

    % 及时求和,减少内存消耗和计算量

    n2_n3_m1_1_1_n4_2=shiftdim(sum(bsxfun(@times,n1_l_l_m1,Q_n1_n2_n3_1_1_1_n4_2)),1); % N2*N3*M1*1*1*N4*2

    n3_m1_m2_1_n4_2=shiftdim(sum(bsxfun(@times,n2_l_l_m2,n2_n3_m1_1_1_n4_2)),1); % N3*M1*M2*1*N4*2

    m1_m2_m3_n4_2=shiftdim(sum(bsxfun(@times,n3_l_l_m3,n3_m1_m2_1_n4_2)),1); % M1*M2*M3*N4*2

    m1m2m3_n4_1_2=reshape(m1_m2_m3_n4_2,M1*M2*M3,N4,1,2); % (M1*M2*M3)*N4*2

    Q_m1m2m3_1_m4_2=reshape(Q_m1_m2_m3_m4_2,M1*M2*M3,1,M4,2); % (M1*M2*M3)*1*M4*2

    n4_m4=sum(shiftdim(sum(bsxfun(@times,m1m2m3_n4_1_2,Q_m1m2m3_1_m4_2)),1),3); % N4*M4

    toc

    disp(n4_m4)

    % ---------------------------------- 结果比较 --------------------------------------

    isequal(F_n4_m4,n4_m4)

    end

    更多相关内容
  • MATLAB工具箱大全-将多重循环转为单重循环-For-Each
  • 多重For循环 优化

    2012-11-06 23:34:34
    多重For循环 优化
  • 通过实际的例子,你会非常容易理解for循环。 你创建一个项目。解决方案名称为Sloution18,项目名称为Exercise18,项目类型为控制台程序。点击Program.cs. 在里边加入这些代码。 简单解释一下这个
  • 【编程技巧】多重for循环优化

    千次阅读 2022-05-24 22:37:46
    编程技巧——多重for循环优化 目录编程技巧——多重for循环优化前言一、优化方案二、示例1.初始化数据2.双重for循环3.list结合map总结 前言 今天群友问了一个问题,多重for循环怎么优化? 然后有感而发,将平时...

    编程技巧——多重for循环优化



    前言

    今天群友问了一个问题,多重for循环怎么优化?
    然后有感而发,将平时编码中对于该种问题的解决方法分享出来,欢迎大家一起探讨学习!


    一、优化方案

    通过list结合map的方式降低时间复杂度,达成多层for循环的优化,文中示例为即兴编写,实际编码过程中还需要根据实际业务进行参考优化。

    二、示例

    1.初始化数据

    业务场景初步定为根据对象A和对象B的某个字段进行匹配然后更新A对象的数据。

    代码如下(示例):

    public class ProcessControlSkill {
    
        public static void main(String[] args) {
            List<ClassA> aList = new ArrayList<>();
            ClassA.ClassABuilder aBuilder = ClassA.builder();
            aBuilder.id(1).aName("1").aValue("1");
            aList.add(aBuilder.build());
            aBuilder.id(2).aName("2").aValue("2");
            aList.add(aBuilder.build());
            aBuilder.id(3).aName("3").aValue("3");
            aList.add(aBuilder.build());
    
            List<ClassB> bList = new ArrayList<>();
            ClassB.ClassBBuilder bBuilder = ClassB.builder();
            bBuilder.id(4).bName("1").bValue("4");
            bList.add(bBuilder.build());
            bBuilder.id(5).bName("2").bValue("5");
            bList.add(bBuilder.build());
            bBuilder.id(6).bName("3").bValue("6");
            bList.add(bBuilder.build());
        }
    }
    
    @Data
    @Builder
    class ClassA{
        private Integer id;
        private String aName;
        private String aValue;
    }
    
    @Data
    @Builder
    class ClassB{
        private Integer id;
        private String bName;
        private String bValue;
    }
    

    2.双重for循环

    代码如下(示例):

            for (ClassA a : aList) {
                for (ClassB b : bList) {
                    if (a.getAName().equals(b.getBName())){
                        a.setAValue(b.getBValue());
                    }
                }
            }
            System.out.println(aList);
    

    运行结果(示例):

    在这里插入图片描述

    3.list结合map

    代码如下(示例):

            Map<String, ClassB> bMap = bList.stream().collect(Collectors.toMap(ClassB::getBName, Function.identity()));
            for (ClassA a : aList) {
                ClassB b = bMap.get(a.getAName());
                if (Objects.nonNull(b)){
                    a.setAValue(b.getBValue());
                }
            }
            System.out.println(aList);
    

    运行结果(示例):
    在这里插入图片描述


    总结

    由示例可以看出,两种写法运行结果是一样的,但是从时间复杂度的角度来看,双重for循环的时间复杂度为n^2,list结合map的方式时间复杂度为2n=n。如果是3层,多层呢,时间复杂度又会再上一个层级,所以合理的利用map去优化多层for循环可以有效的降低时间复杂度。

    展开全文
  • 主要介绍了Java for循环性能优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 前情提要:python在处理高时间复杂度的双重for循环时候效率低,而多线程又不适合于计算密集的任务提速。昨天睡之前让电脑自己运行17000*17000的计算,结果跑了19000秒。 因此尝试寻求为python提速的解决方案。在那...
  • 多重for循环优化,提升运行效率

    万次阅读 多人点赞 2018-07-18 09:37:08
    在循环次数较少的时候一般...客户体验会非常不好,才研究这个情况的,事实证明,优化后的多重for循环提升了一大半的效率,是不是很神奇。 当然,本文也有借鉴其他同胞的方法。 实例化变量放在for循环外,减少实...

    在循环次数较少的时候一般不会发现for循环的写法会对效率产生多大问题,但一旦循环次数较多,比如说上万,循环层数较多,效率问题就非常明显了,我是在做一个数据量非常大有三层for循环的项目的时候,为显示曲线出来太花费时间,客户体验会非常不好,才研究这个情况的,事实证明,优化后的多重for循环提升了一大半的效率,是不是很神奇。
    当然,本文也有借鉴其他同胞的方法。

    1. 实例化变量放在for循环外,减少实例化次数,尽量只实例化一次;

    2. 普通变量 改为 寄存器变量
      i++ 改为 ++i

      int i=0, j;
      j=++i; //前置版本,运算对象先自增1,然后将改变后的对象作为求值结果,再赋值给j;
      j=i++; //后置版本,先赋值给j;再运算对象自增1,但求值结果是运算对象改变之前那个值的副本.

      C++Primer 中解释:前置版本的递增运算符避免了不必要的工作,它把值加1后直接返回改变了的运算对象。与之相比,后置版本需要将原始值存储下来以便于返回这个未修改的内容,如果我们不需要修改前的值,那么后置版本的操作就是一种浪费。

    3. for(int i = 0; i<50; i++)
      循环条件使用<要快于<=,>和>=同理;

    4. 把外层可以计算的尽可能放到外层,减少在内层的运算,有判断条件的语句和与循环不相关的操作语句尽量放在for外面;

    5. 应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数;
      采用的是行优先访问原则,与元素存储顺序一致。

      这里写图片描述

    6. 对于一个可结合和可交换的合并操作来说,比如整数的加法或乘法,
      我们可以通过将一组合并操作分割成 2 个或更多的部分,并在最后合并结果来提高性能。
      原理:
      普通代码只能利用 CPU 的一个寄存器,分割后可以利用多个寄存器。
      当分割达到一个数量时,寄存器用完,性能不再提升,甚至会开始下降。
      用代码来描述,如下:

      // 一般情况下的代码 for (i = 1; i < n+1; i++)
      {
          res = res OPER i;
      }
      
      // 循环分割后代码for (i = 1; i < n; i+=2)
      {
          res1 = res1 OPER i;
          res2 = res2 OPER (i+1);
      }

      int 整数加法,性能测试结果对比如下:
      整数的加法,普通代码运行 26s,循环分割后,18s。
      浮点数计算的性能提升,明显大于整数,乘法的性能提升,略大于加法。

    展开全文
  • 主要简单介绍了C语言中for循环语句的基本使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下
  • 然而,我们有时候会需要跳出多重循环,而break只能够跳出一层循环,比如: for i in range(10): for j in range(10): if i+j > 5: print i,j break 这样的代码并非说找到一组 i+j > 5就停止,而是连续找到10组...
  • 多重for循环嵌套

    万次阅读 多人点赞 2017-05-27 08:15:07
    for循环定义: 同过一个简单的表达式,来完成多次重复性的代码功能;格式如下: for(变量初始值;变量取值范围;变量自增/自减){ //代码块; } 一个复杂的for循环中可以嵌套多个同级的for循环,一般表现如下...

    for循环定义:
    同过一个简单的表达式,来完成多次重复性的代码功能;格式如下:
    for(变量初始值;变量取值范围;变量自增/自减){
    //代码块;
    }
    一个复杂的for循环中可以嵌套多个同级的for循环,一般表现如下:
    for(变量初始值;变量取值范围;变量自增/自减){
    for(变量初始值;变量取值范围;变量自增/自减){
    //代码块
    }
    for(变量初始值;变量取值范围;变量自增/自减){
    //代码块
    }
    }
    多重for循环的执行顺序是,最外面的for循环执行一次,里面的同层级的for循环就会执行一轮;举个例子,用“*”输出一个4*4的正方形。

    “`
    这里写代码片
    package com.for.rumple;

    public class ForTest {

    public static void main(String[] args) {
    //第一层for循环用来控制输出的行数;
        for (int i = 1; i <= 4; i++) {
    //第二层for循环用来控制输出的列数;
            for (int j = 1; j <= 4; j++) {
                System.out.print("*");
            }
    //外层的for执行一次,就
            System.out.println();
        }
    }
    

    }

    效果图:
    这里写图片描述
    下面展示一个三层for循环打印的图案:
    源码:
    package com.for.rumple;

    public class ForTest01 {

    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            for (int k = 5 - i; k > 0; k--) {
                System.out.print("-");
            }
            for (int j = 1; j < 2 * i; j++) {
                System.out.print("*");
            }
            for (int k = 5 - i; k > 0; k--) {
                System.out.print("-");
            }
            System.out.println();
        }
    }
    

    }
    效果图(分两张讲解):
    这里写图片描述

    这里写图片描述

    展开全文
  • python for循环优化

    2020-12-22 13:22:55
    最初,建立项目时用户少,中间使用了for循环,还是嵌套的,共两层,项目整体运行一次耗时1-2个小时。最近,随着用户量增长,项目耗时达到6-7个小时。显然是不能接受的。 for t, w in user_tags: for it, w in tag_...
  • 多重 for 循环,应该如何提高效率?

    千次阅读 多人点赞 2020-08-28 00:20:23
      我在《华为 C 语言编程规范》中看到了这个:当使用多重循环时,应该将最忙的循环放在最内层。如下图:   由上述很简单的伪代码可以看到,推荐使用的方式是:外小内大的方式。也就是内层循环是最忙的。   ...
  • 在使用嵌套循环构造n-d坐标然后对其进行操作的模式可以使用```numpy.meshgrid````将矢量化d。如果不知道你的实际计算,这种方法是无法测试的。在import numpy as npa = np.array([0,1,2])b = np.array([10,11,12])c ...
  • MATLAB利用parfor计算多重for循环

    万次阅读 2018-11-11 11:35:10
    当MATLAB程序中出现多个for循环时,为提高运行效率,可用如下方式实现循环变量索引。 clear; clc; M = 2; N = 3; R = 4; parfor i = 0 : M * N * R - 1 ii = floor(i / (N * R)) + 1; jj = floor(mod(i, N * R...
  • 本篇文章主要介绍了Java用for循环Map,需要的朋友可以过来参考下,希望对大家有所帮助
  • 理解 Python 的 for 循环

    千次阅读 2020-12-08 17:12:02
    在本篇博客中,我们将讨论 Python 中 for 循环的原理。我们将从一组基本例子和它的语法开始,还将讨论与 for 循环关联的 else 代码块的用处。然后我们将介绍迭代对象、迭代器和迭代器协议,还会学习如何创建自己的...
  • python3:多重for循环的中断

    千次阅读 2019-04-14 15:08:08
    python的语法并不支持跳出多重循环,break只能跳出一重循环,如下面的这个: a, b, c = 0, 0, 0 total = 0 for i in range(3): for j in range(3): for k in range(3): if i == j == k == 1: a, b, c = ...
  • C语言奇妙之旅_多重for循环

    千次阅读 2018-07-27 21:04:10
    多重for循环   多重循环就是在循环结构的循环体中又出现循环结构 在实际开发中一般最多用到三层多重循环。 循环层数越多, 运行时间越长, 程序越复杂, 所以一般用两到三层多重循环就可以了!   多层循环为父...
  • 目前全部使用的是for循环进行赋值,这样运算速度非常慢,请问该怎样提高运算速度? 代码部分如下: ``` OP.B_1 = 0.1:0.1:1.8; OP.B_2 = 0.1:0.1:1.8; OP.B_3= 0.1:0.1:1.8; OP.B_4 = 0.1:0.1:1.8; OP.B_5...
  • Java跳出多重for循环

    2017-03-13 19:44:06
    1.设置标记,然后使用带此标号的break语句跳出多重循环。public void test(){ OK://设置一个标记 使用带此标记的break语句跳出多重循环for(int i=1; i; i++){ for(int j=1; j; j++){ if(i==10){ break OK;
  • 以下是测试代码,我的实际代码看起来几乎相似,其中我使用原始矩阵而...在Python中优化多重嵌套for循环import timeimport numpy as npa = 1000b = 500sum2,sum3,sum4 = 0t0 = time.time()x = np.random.random(a*a)...
  • C语言,数据结构,线性代数,二维数组,矩阵,算法之间的关系是怎么样的?从频度引发的c语言多重for循环乃至编写算法思路的思考,整篇文章从频度开始,讲述两个矩阵相乘算法,最后讲述整个算法的设计原理。
  • 1.示例 如下打印,说明成功进行3次循环
  • 文章目录一、9×9乘法守则二、正直角三角形方法一方法二三、倒直角三角形方法一方法二四、反方向的直角三角形正的反的延伸:平行四边形五、等...for ((a=1;a<=9;a++)) do for ((b=1;b<=$a;b++)) do c=$[$a*$b]
  • 多重for循环打印等腰三角形

    千次阅读 2021-02-05 23:33:56
    多重for循环打印等腰三角形 观察 * 和 空格出现的规则,用多重for循环实现打印等腰三角形,。 思想一: 先打印左边空格,再打印每行空格右边的 * 数,我们发现,左边空格数等于行数 - i ( 如5 - i 注意for循环具体...
  • 今天小编就为大家分享一篇基于vue v-for 多层循环嵌套获取行数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如: ok: for(int i=0;i<10;i++) { for(int j=0;j<10;j++) ...
  • python跳出多重for循环

    千次阅读 2019-04-28 17:33:36
    2. 使用 for … else 语法 for i in range(6): for j in range(6): for k in range(6): if i == j == k == 4: break #注意,这里的break使得3行后的continue不得执行,使得程序无法直接跳转到第...
  • Python的语法糖非常强大,比如Python中在for循环中嵌套使用if和else语句的技巧便十分给力,下面我们就举几个例子来看详细的用法: for…[if]…构建List (List comprehension) 1.简单的for…[if]…语句 Python中,for...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,207
精华内容 27,282
热门标签
关键字:

多重for循环怎么理解