首页 > 其他分享 >如何减少for循环层次

如何减少for循环层次

时间:2023-10-24 09:33:33浏览次数:26  
标签:prime 表示 层次 矩阵 三维 二维 循环 一维 减少

背景

数值上计算能量本征值往往采用矩阵对角化的方法。第一步是需要生成如下的矩阵:

\[\braket{n|H|n^{\prime}} \]

在计算这个矩阵的时候,只涉及两个变量:\(n\),\(n^{\prime}\)。因此两重for循环就可以解决这个问题。

但是其他的情况下(如:系统中有两个粒子),需要生成的矩阵变成了:

\[\braket{n_1,n_2|H|n_{1}^{\prime},n_{2}^{\prime}} \]

这种模式。就涉及到了四个变量,难道要写四重for循环吗?

for循环降维

在计算机存储中高维的矩阵其实都是线性存储的。并且所有的高维数组都可以被拉成一维。

二维

如下图所示的一个N\(\times\)M的二维矩阵,其中N=3,M=3。用\(i\)表示每一个矩阵元的编号,用\(n\)表示矩阵的行编号,用\(m\)表示矩阵的列编号。图中红圈圈中的就是第一行第一列第4个矩阵元,原本我们表示这个矩阵元需要\((1,1)\),现在可以直接用\(4\)表示。原本我们表示某一个矩阵元需要\((n,m)\),现在可以直接用\(i=n*M+m\)表示。

NM401235678

三维

通常表示三维矩阵中的一个矩阵元需要\((n,m,l)\),先利用二维矩阵的处理方法,将前两维看成一维,则矩阵元可以表示为\((n*M+m,l)\),拉成一维以后则可以用\((n*M+m)*L+l\)来表示。

NM401235678...L

更高维度的表示方法与此类似(逐维降低:四维拉成三维——>三维拉成二维——>二维拉成一维)。

代码展示

//降维前
for(int n1=0;n1<n_1m;n1++){
    for(int n2=0;n2<n_2m;n2++){
        for(int n11=0;n11<n_1m;n11++){
            for(int n21=0;n21<n_2m;n21++>){
                pass
            }
        }
    }
}
\\降维后
n = n_1m*n_2m;
for(int i=0;i<n;i++){
    n1 = i/n_2m;
    n2 = i%n_2m;
    for(int j=0;j<n;j++){
        n11 = j/n_2m;
        n21 = j%n_2m;
    }
}

其他的应用

动态分配内存的时候分配二维的地址往往很麻烦,将数组拉成一维然后动态存储也是可以的。

标签:prime,表示,层次,矩阵,三维,二维,循环,一维,减少
From: https://www.cnblogs.com/jia-t-t/p/17783991.html

相关文章

  • 高级循环(附带小练习以及详细代码)
     1.无限循环概念:又叫死循环。循环一直停不下来。for格式:for(;;){System.out.println("循环执行一直在打印内容");}解释:初始化语句可以空着不写,表示循环之前不定义任何的控制变量。条件判断语句可以空着不写,如果不写,默认表示true,循环一直进行。条件控制语句可以空着不写,表示......
  • 分支与循环结构
    一套语言主要由三种结构组成(顺序结构、选择结构、循环结构)。今天给大家介绍一下后两者中的分支与循环。一、分支(选择)语句有if语句和switch语句:1.if:(1)if(表达式)【表达式表示真假】所执行的语句注意:一个if默认包含一个语句,若要控制多个......
  • Java基础 字节输入流的循环读取
    FileInputStreamfis=newFileInputStream("E:\\Java基础资料\\a.txt");/*intb;while((b=fis.read())!=-1){System.out.print((char)b);}*/while(true){intb=fis.read();if(b==-1)break;System.out.print((char)b);}fis.clo......
  • C语言 replace循环替换
    注意:字符串长度可自行定义;可以增加字符串长度判断,防止溢出。//方法一intreplace(char*src,char*old,char*new){charbuff[2048];//转换缓冲区memset(buff,0,sizeof(buff));for(inti=0;i<strlen(src);i++){//查找目标字符串......
  • 第五课 循环
    随机数,用rand(),前面还要加前缀。 整数求逆,当整数中没有0时,可以直接逆运算,用取余来做;如果有0的存在,就需要注意不要\n换行,只有不换行1才能连接起来。 平均数,需要想清楚需要三个变量,一个是次数:需要用到count++;一个是每次输入的数,;一个是累次相加的数。  ......
  • 实验2 c语言分支与循环基础应用编程
    task11#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13747#defineN246589intmain()10{11intnumber;12inti;13srand(time(0));//以当前系统时间作为随机种子14for(i=0;i<N;......
  • 实验2_C语言分枝与循环基础应用编程
    试验任务1task1.c#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1374#defineN2465intmain(){intnumber;inti;srand(time(0));for(i=0;i<N;++i){number=r......
  • 实验2 C语言分支与循环基础应用编程
    实验任务1#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1374#defineN2465intmain(){intnumber;inti;srand(time(0));for(i=0;i<N;++i){number=rand()%(N2-N1+1)+N1;pr......
  • 实验2 C语言分支与循环基础应用编程
    实验任务1源代码1#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13747#defineN246589intmain()10{11intnumber;12inti;1314srand(time(0));1516......
  • 无涯教程-AWK - 循环语句
    本章以适当的示例说明AWK的循环,循环用于以重复的方式执行一组动作,只要循环条件为真,循环就会继续执行。For循环for循环的语法是-for(initialization;condition;increment/decrement)action最初,for语句执行初始化操作,然后检查条件。如果条件为真,则执行操作,然后执行......