ENVI_IDL: 基础语法详解

01 题目

 

02 代码说明

题目本身很简单,但是我自己加了一些东西进去增加难度。主要包括print函数的封装、格式化字符串,但是不影响代码的阅读。(注:对于没有语言基础的人而言相对阅读困难,但是由于IDL是解释型语言,类似于Python,所以难度不会太难)

提示:

findgen(3, 4, start=2): 定义3列4行的索引数组(先列后行),第一个数组元素值默认为0,这里start为2,故从2开始;
 

b = 3s:定义整型变量,s可不写;


c = [3]:定义仅有一个元素的数组,该元素值为3;

d = [9, 3, 1]:定义含多个元素的数组;

+:原本只能进行数值之间的运算,这里进行了重载使得可以进行字符串的连接,类似于python;

string(a[3, 4], format='(f5.2)'):格式化输出,输出的变量转为浮点型,总宽度为5(小数点也算一个宽度),小数位宽度为2.

string(a[3, 4], format='%.2f'):格式化输出,或许已经发现了,前面的format实际上是fortran语言的格式化输出样式,但是我不太了解该语言所以用不顺手,我更倾向于C语言的格式化的输出(Yeah,IDL支持C语言和Fortran两种的语言的格式化输出<绝大部分一致>)。这里的含义与上一致,具体百度C语言格式化输出即可;

&:这是一个连续化符,用于将多个操作或者指令放在一行执行;

a = [[3, 9, 10], [2, 7, 5], [4, 1, 6]]: 这是自定义一个二维数组,注意,数组的定义均是使用中括号[],高维亦是如此;


printArray:这是定义的一个函数(详见下文),其中的arr是位置参数,prefix,format都是关键字参数;

dims = size(arr, /dimensions):获取数组arr的维度信息(以数组形式返回);

strcompress():返回传入的字符串的副本,这个副本是将原来的字符串中的所有的空白字符和制表符全部换成了一个空白字符或者直接全部移除。自己多用多体会就清楚了。

gt, ge, lt, le, ne, eq:这些很简单,就是大于(greater than, gt),大于等于(greater than or equal, ge),小于(less than,lt),小于等于(less than or equal, le),等于(equal,eq)。比较运算符。

+,-,*,/,^, mod:^是次方数,例如2的8次方就是2 ^ 8,mod是取余运算,例如9 mod 2 等于1.

float():强制转换符,将其他数据类型转换为浮点型。

write_tiff,'D:\Objects\JuniorFallTerm\IDLProgram\Project\ExperimentsMe\Week1\Data\temp.tif', img, /float:第一个参数传入路径名称(\和/都行,但是后面的HDF读取内部数据集的路径只允许/因此建议都用/会更好)。第二个参数传入需要写入的数组。另外如果不传入参数/float那么write_tiff函数默认以整型写入(尽管数组的数据类型为浮点型)。

; @Author: ChaoQiezi
; @Email: chaoqiezi.one@qq.com
; @Time: 2023-09-11; This script is used to basic practice; This function is used to print array
function  printArray, arr, prefix=prefix, format=formatdims = size(arr, /dimensions)if  n_elements(prefix) then print, prefixif ~n_elements(format) then format='%.2f'for row = 0, dims[1] - 1 do beginarr_row = arr[*, row]formatted_row = strcompress(string(arr_row, format=format))output = '      'for col = 0, dims[0] - 1 do beginoutput += formatted_row[col]if col ne dims[0] - 1 then output += ', 'endforprint, outputendfor
endpro basic_pracitce; question-1a = findgen(4, 6)  ; define the index array(float)b = 3s  ; define the int varc = [3]  ; define the arrayd = [9, 3, 1]print, 'the value for col 3 and row 4 is: ' + string(a[3, 4], format='%.2f')print, 'the value with index 15: ' + string(a[15], format='%.2f')printArray, a + b, PREFIX='a plus b is equal to: 'print, 'a[1, 1] plus b is equal to: ' + string(a[1, 1] + b, format='%.2f')print, 'a plus b is equal to: ', a + c & help, a + cprint, 'a plus c is equal to: ', a + d & help, a + d; question2a = [[3, 9, 10], [2, 7, 5], [4, 1, 6]]b = [[7, 10, 2], [5, 8, 9], [3, 1, 6]]printArray, a + b, prefix='a plus b is equal: ' printArray, a * b, prefix='a times b is equal to: '; question3a = [[0, 5, 3], [4, 0, 2], [0, 7, 8]]b = [[0, 0, 1], [9, 7, 4], [1, 0, 2]]printArray, (a gt 3) * a, prefix='keep the result greater than 3 in a, and set all the rest to 0: 'printArray, (b le 4) * b + (b gt 4) * 9, prefix='keep the result less than or equal to 3 in ' + $'a, and set all the rest to 9: ', format='%i'printArray, (a + b) / 2.0, prefix='calculate the mean of a and b: 'printArray, ((a ne 0) and (b ne 0)) * ((a + b) / 2.0)+ (a eq 0) * b + (b eq 0) * a, $prefix='calculate the mean of a and b, and 0 values are not included in the calculation: 'print, (a + b) / float((a ne 0) + (b ne 0))  ; equal above and simple    ; question4img = findgen(1024, 1024)
;    image(img, /order)write_tiff, 'D:\Objects\JuniorFallTerm\IDLProgram\Project\ExperimentsMe\Week1\Data\temp.tif', img, /float
end

03 其它

可以尝试将函数printArray的定义修改为(仅仅是function修改为pro):
 

pro  printArray, arr, prefix=prefix, format=formatdims = size(arr, /dimensions)if  n_elements(prefix) then print, prefixif ~n_elements(format) then format='%.2f'for row = 0, dims[1] - 1 do beginarr_row = arr[*, row]formatted_row = strcompress(string(arr_row, format=format))output = '      'for col = 0, dims[0] - 1 do beginoutput += formatted_row[col]if col ne dims[0] - 1 then output += ', 'endforprint, outputendfor
end

整个程序仍然可以运行,像这样的话我们就清楚了我们pro文件可以包含多个子程序(多个pro过程),但是我们的pro文件从哪个子pro程序开始运行呢?这就与我们当初pro文件的命名相关,pro文件将与pro文件名一致的子pro程序作为类似main的入口进入顺序运行。
 

另外,ENVI IDL支持python代码的运行,例如:

其他详见帮助,IDL版本过旧可能不支持,IDL85貌似支持Python3.8以下,因为我目前是IDL8.5,Python3.8.

04 Python代码实现

比较简单,暂无解释

# @Author   : ChaoQiezi
# @Time     : 2023-09-12  23:20
# @Email    : chaoqiezi.one@qq.com"""
This script is used to learn basic grammar of python.
"""import numpy as np
from osgeo import gdal# 第一问
def question1():a = np.arange(24, dtype=np.float32).reshape(6, 4)b = 3c = np.array([3])d = np.array([9, 3, 1])print(a[4, 3])  # 取第3列第4行的数值print(a.flatten()[15])  # 取第15个索引的数值print(a + b)print(a[1, 1] + b)  # 8.0print(a + c)  # 与IDL结果不一致, 这是因为c是一维数组, 会自动广播# print(a + d)  # 直接报错, 维度不一致# 第二问
def question2():a = np.array([[3, 9, 10], [2, 7, 5], [4, 1, 6]])b = np.array([[7, 10, 2], [5, 8, 9], [3, 1, 6]])print(a + b)print(a * b)# 第三问
def question3():a = np.array([[0, 5, 3], [4, 0, 2], [0, 7, 8]])b = np.array([[0, 0, 1], [9, 7, 4], [1, 0, 2]])# 取a大于3的结果,其余为0print((a > 3) * a)  # or thisprint(np.where(a > 3, a, 0))# 取b中小于等于4的结果,其余为9print((a <= 4) * a + (a > 4) * 9)print(np.where(a <= 4, a, 9))# 计算A和B的均值print((a + b) / 2)print(np.mean(a + b))  # or this# 计算A和B的均值, 0不纳入计算print((a + b) / ((a > 0) + (b > 0)))def write_tiff(out_path: str, data: np.ndarray):driver = gdal.GetDriverByName('GTiff')out_ds = driver.Create(out_path, data.shape[1], data.shape[0], 1, gdal.GDT_Float32)  # col, rowout_ds.GetRasterBand(1).WriteArray(data)out_ds.FlushCache()del out_dsdef question4():a = np.arange(1024*1024, dtype=np.float32).reshape(1024, 1024)write_tiff(r'D:\Objects\JuniorFallTerm\IDLProgram\Project\PyExperiments\Experiments\week1\temp.tiff', a)if __name__ == '__main__':question1()question2()question3()question4()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮 效果图代码解析 效果图 代码解析 import { Form, Upload, message } from antd; import { PlusOutlined } from ant-design/icons; import { useState, useEffect } from react; import { BASE_URL } from /utils/…

网络爬虫-----初识爬虫

目录 1. 什么是爬虫&#xff1f; 1.1 初识网络爬虫 1.1.1 百度新闻案例说明 1.1.2 网站排名&#xff08;访问权重pv&#xff09; 2. 爬虫的领域&#xff08;为什么学习爬虫 ?&#xff09; 2.1 数据的来源 2.2 爬虫等于黑客吗&#xff1f; 2.3 大数据和爬虫又有啥关系&…

stm32---基本定时器(TIM6,TIM7)

STM32F1的定时器非常多&#xff0c;由两个基本定时器&#xff08;TIM6&#xff0c;TIM7&#xff09;、4个通用定时器&#xff08;TIM2-TIM5&#xff09;和两个高级定时器&#xff08;TIM&#xff11;&#xff0c;TIM&#xff18;&#xff09;组成。基本定时器的功能最为简单&am…

〔022〕Stable Diffusion 之 生成视频 篇

✨ 目录 &#x1f388; 视频转换 / mov2mov&#x1f388; 视频转换前奏准备&#x1f388; 视频转换 mov2mov 使用&#x1f388; 视频转换 mov2mov 效果预览&#x1f388; 视频无限缩放 / Infinite Zoom&#x1f388; 视频无限缩放 Infinite Zoom 使用 &#x1f388; 视频转换 /…

ITIL 4—创建、交付和支持—设定工作优先级和管理供应商

5. 设定工作优先级和管理供应商 5.1 为什么我们要对工作优先级排序? 只要工作需求超出了在预期时间内能完成的产能&#xff0c;就会出现排队的情况。在理想情况下&#xff0c;组织的需求没有任何变化&#xff0c;并且拥有满足需求所需的适当质量和数量的资源。但现实里&…

Tomcat多实例部署和动静分离

一、多实例部署&#xff1a; 多实例&#xff1a;多实例就是在一台服务器上同时开启多个不同的服务端口&#xff0c;同时运行多个服务进程&#xff0c;这些服务进程通过不同的socket监听不同的服务端口来提供服务。 1.前期准备&#xff1a; 1.关闭防火墙&#xff1a;systemctl …

Multi Query Attention Group Query Attention

Multi Query Attention(MQA)在2019年就被提出来了&#xff0c;用于推理加速&#xff0c;但在当时并没有受到很多关注&#xff0c;毕竟一张2080就能跑Bert-base了。随着LLM的大火&#xff0c;MQA所带来的收益得以放大。 思路 Multi Query Attention(MQA)跟Multi Head Attention…

计算机视觉实战项目(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别)

图像分类 教程博客_传送门链接:链接 在本教程中&#xff0c;您将学习如何使用迁移学习训练卷积神经网络以进行图像分类。您可以在 cs231n 上阅读有关迁移学习的更多信息。 本文主要目的是教会你如何自己搭建分类模型&#xff0c;耐心看完&#xff0c;相信会有很大收获。废话不…

自动驾驶汽车下匝道路径优化控制策略研究

摘要 随着社会不断进步&#xff0c; 经济快速发展&#xff0c; 科学技术也在突飞猛进&#xff0c; 交通行业是典型的领域之一。现阶段的交通发展&#xff37; 实现智能交通系统为目标&#xff0c; 正逐渐从信息化步入智能化&#xff0c;朝着智慧化迈进。近年来&#xff0c;一系…

DeepinV20/Ubuntu安装postgresql方法

首先&#xff0c;建议看一下官方的安装文档PostgreSQL: Linux downloads (Ubuntu) PostgreSQL Apt Repository 简单的说&#xff0c;就是Ubuntu下的Apt仓库&#xff0c;可以用来安装任何支持版本的PgSQL。 If the version included in your version of Ubuntu is not the one…

MYBATIS-PLUS入门使用、踩坑记录

转载&#xff1a; mybatis-plus入门使用、踩坑记录 - 灰信网&#xff08;软件开发博客聚合&#xff09; 首先引入MYBATIS-PLUS依赖&#xff1a; SPRING BOOT项目&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus…

C++信息学奥赛1170:计算2的N次方

#include <iostream> #include <string> #include <cstring>using namespace std;int main() {int n;cin >> n; // 输入一个整数nint arr[100];memset(arr, -1, sizeof(arr)); // 将数组arr的元素初始化为-1&#xff0c;sizeof(arr)表示arr数组的字节…

分类预测 | Matlab实现基于BP-Adaboost数据分类预测

分类预测 | Matlab实现基于BP-Adaboost数据分类预测 目录 分类预测 | Matlab实现基于BP-Adaboost数据分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于BP-Adaboost数据分类预测&#xff08;Matlab完整程序和数据&#xff09; 2.多特征输入…

刷刷刷——双指针算法

双指针算法 这里的双指针&#xff0c;可能并不是真正意义上的指针&#xff0c;而是模拟指针移动的过程。 常见的有两种&#xff1a; 双指针对撞&#xff1a; 即在顺序结构中&#xff0c;指针从两端向中间移动&#xff0c;然后逐渐逼近 终止条件一般是&#xff1a; left ri…

Java面试笔试acm版输入

首先区分scanner.nextInt()//输入一个整数&#xff0c;只能读取一个数&#xff0c;空格就停止。 scanner.next()//输入字符串&#xff0c;只能读取一个字符串&#xff0c;空格就停止&#xff0c;但是逗号不停止。 scanner.nextLine() 读取一行&#xff0c;换行停止&#xff0c…

Excel、Jira、Bugfree 应该选哪个做bug管理?深度对比

如何选择最适合您团队的Bug管理系统&#xff1f;本指南提供了全面的选型建议&#xff0c;并深度对比了7类主流工具如PingCode、Jira、 Mantis等&#xff0c;涵盖功能、成本、易用性等多个关键因素。适用于软件开发团队、项目经理和决策者。 一、适合的BUG管理工具在产品开发中的…

Web Component -- 即将爆发的原生的 UI 组件化标准

Web Component 概述 Web Component 是一种用于构建可复用用户界面组件的技术&#xff0c;开发者可以创建自定义的 HTML 标签&#xff0c;并将其封装为包含逻辑和样式的独立组件&#xff0c;从而在任何 Web 应用中重复使用。 每个 Web Component 都具有自己的 DOM 和样式隔离&a…

2023-09-12 LeetCode每日一题(课程表 IV)

2023-03-29每日一题 一、题目编号 1462. 课程表 IV二、题目链接 点击跳转到题目位置 三、题目描述 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你…

华为CD32键盘使用教程

华为CD32键盘使用教程 用爱发电写的教程&#xff01; 最后更新时间&#xff1a;2023.9.12 型号&#xff1a;华为有线键盘CD32 基本使用 此键盘在不安装驱动的情况下可以直接使用&#xff0c;但是不安装驱动指纹识别是无法使用的&#xff01;并且NFC功能只支持华为的部分电脑…

科技资讯|苹果虚拟纸可在Vision Pro中为广告、书籍等提供MR内容和动画

近日&#xff0c;美国专利商标局正式授予苹果一项与虚拟纸张相关的专利。这是与虚拟纸张这项发明相关的第二项专利&#xff0c;鉴于苹果 Vision Pro 将于明年上市&#xff0c;那么我们离苹果实现虚拟纸张的发明又近了一步。 虚拟纸张将能够包含 2D、3D 和动画等 MR内容&#…