ENVI_IDL: 基础语法详解

news2024/11/24 19:12:50

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=format
    dims = size(arr, /dimensions)
    if  n_elements(prefix) then print, prefix
    if ~n_elements(format) then format='%.2f'
    
    for row = 0, dims[1] - 1 do begin
        arr_row = arr[*, row]
        formatted_row = strcompress(string(arr_row, format=format))
        
        output = '      '
        for col = 0, dims[0] - 1 do begin
            output += formatted_row[col]
            if col ne dims[0] - 1 then output += ', '
        endfor
        
        print, output
    endfor
end

pro basic_pracitce
    ; question-1
    a = findgen(4, 6)  ; define the index array(float)
    b = 3s  ; define the int var
    c = [3]  ; define the array
    d = [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 + c
    print, 'a plus c is equal to: ', a + d & help, a + d
    
    ; question2
    a = [[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: '
    
    ; question3
    a = [[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    
    
    ; question4
    img = 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=format
    dims = size(arr, /dimensions)
    if  n_elements(prefix) then print, prefix
    if ~n_elements(format) then format='%.2f'
    
    for row = 0, dims[1] - 1 do begin
        arr_row = arr[*, row]
        formatted_row = strcompress(string(arr_row, format=format))
        
        output = '      '
        for col = 0, dims[0] - 1 do begin
            output += formatted_row[col]
            if col ne dims[0] - 1 then output += ', '
        endfor
        
        print, output
    endfor
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 = 3
    c = 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.0
    print(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的结果,其余为0
    print((a > 3) * a)  # or this
    print(np.where(a > 3, a, 0))
    # 取b中小于等于4的结果,其余为9
    print((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, row
    out_ds.GetRasterBand(1).WriteArray(data)
    out_ds.FlushCache()
    del out_ds

def 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.coloradmin.cn/o/1005686.html

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

相关文章

文字点选验证码识别(下)-训练一个孪生神经网络模型

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 文章中没有代码,只有过程思路,请大家谨慎订阅。…

Windows下的Elasticsearch-head安装

Windows下的Elasticsearch-head安装 参考&#xff1a;https://gitcode.net/mirrors/mobz/elasticsearch-head 需要用到 npm 命令&#xff0c;这里可以提前下载安装下Node.js 即可自动安装npm&#xff1b; Node.js 下载安装地址&#xff1a;https://nodejs.org/en/download # 进…

【Unity每日一记】音频,麦克风,粒子和拖尾渲染器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

LCD1602液晶显示屏介绍和程序开发

1.LCD1602概述 LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符(16列两行) 引脚说明第 1 脚: VSS 为电源地第 2 脚: VDD 接 5V 正电源第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱&…

华为云云耀云服务器L实例评测| ultralytics最先进模型YOLOv8深度学习AI训练

目录 前言 登录服务器 安装pyhton 部署yolov8 安装Pytorch 下载权重文件 训练模型 前言 前几期我们在云耀云服务器L实例上分别使用docker和直接在centos上部署了yolov5识别API&#xff0c;前端项目vue&#xff0c;后端项目.net Core Web Api,但是从监控图上来看&#…

联网汽车和网络犯罪:入门

正在权衡如何投资预算的原始设备供应商 ( OEM ) 及其供应商可能倾向于放慢应对网络威胁的投资。迄今为止&#xff0c;他们遇到的攻击仍然相对简单&#xff0c;危害性也不是特别大。 然而&#xff0c;对地下犯罪信息交换中的聊天记录的分析表明&#xff0c;这些碎片的存在是为了…

html5学习笔记22-JavaScript 简略学习

https://www.runoob.com/js/js-tutorial.html JavaScript 是 Web 的编程语言。与java无关。 案例&#xff1a;https://c.runoob.com/examples/ JavaScript 是一种轻量级的编程语言、可插入 HTML 页面的编程代码、脚本语言。 ECMA-262 是 JavaScript 标准的官方名称。 HTML 中的…

房地产小程序 | 小程序赋能,房地产业务数字化升级

随着科技的不断发展&#xff0c;房地产行业正逐渐向数字化转型。在这个过程中&#xff0c;房地产小程序成为了一种重要的工具&#xff0c;可以帮助房地产企业提供更好的购房体验、增加销售额&#xff0c;并实现管理的便捷化。 优点 便捷购房体验&#xff1a;房地产小程序为用户…

vite + react + typescript + uni-app + node 开发一个生态系统

简介 使用 vite react typescript uni-app node 来开发一个简易的生态系统案例&#xff0c;包含 APP&#xff0c;H5&#xff0c;微信小程序&#xff0c;控制台&#xff0c;服务端 开发 admin 技术栈&#xff1a;vite react typescript初始化控制台项目选择自定义预设…

快速傅里叶变化

引言 目标 傅里叶变化&#xff08;Fourier transform&#xff09;是一种信号处理技术&#xff0c;它可以将时间信号转换为频率信号&#xff0c;即将一组具有相同数量频率的正弦波叠加在一起&#xff0c;形成一组新的正弦波。如果我们把时间信号从频域转换到时域&#xff0c;那么…

手搭手入门MybaitsX

Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis(opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#xff1a;只做增强…

2022年全国研究生数学建模竞赛华为杯C题汽车制造涂装-总装缓存调序区调度优化问题求解全过程文档及程序

2022年全国研究生数学建模竞赛华为杯 C题 汽车制造涂装-总装缓存调序区调度优化问题 原题再现&#xff1a; 背景介绍   汽车制造厂主要由焊装车间、涂装车间、总装车间构成&#xff0c;每个车间有不同的生产偏好&#xff0c;如&#xff1a;焊装车间由于车身夹具的限制偏向最…

【C语言】指针的“最后一站”【进阶版】

欢迎各位看官^_^ 目录 1、字符指针 2、指针数组 3、数组指针 3.1数组指针的定义 3.2数组指针的使用 4、数组指针和指针数组的区别 5、数组参数&#xff0c;指针参数 5.1数组参数定义 5.2指针参数定义 5.3一维数组传参 5.4二维数组传参 5.5一级指针传参 5.6二级指…

Matlab图像处理-彩色图像基础

光谱 在17世纪60年代&#xff0c;人们普遍认为白光是一种没有其他颜色的纯色光&#xff0c;而彩色光是有某种缘故发生变化的光。为了验证这个假设&#xff0c;牛顿让一束阳光通过一面三棱镜&#xff0c;光线在墙上被分解成了八种不同的颜色&#xff0c;即&#xff1a;红、橙、…

Unity SteamVR 开发教程:SteamVR Input 输入系统(2.x 以上版本)

文章目录 &#x1f4d5;前言&#x1f4d5;教程说明&#x1f4d5;导入 SteamVR 插件&#x1f4d5;SteamVR Input 窗口⭐action.json 文件⭐窗口面板⭐SteamVR_Input 目录 &#x1f4d5;SteamVR 动作的类型⭐Boolean⭐Single⭐Vector2⭐Vector3⭐Pose⭐Skeleton⭐Vibration &…

postgresql -数据库事务与并发控制

postgresql -数据库事务与并发控制 数据库事务事务控制语句并发与隔离数据库事务 事务控制语句 -- serial 自增 CREATE TABLE accounts(id serial PRIMARY KEY,user_name varchar(50),balance numeric

Windows11 OneDrive 安装后无法打开的解决办法

按 WinR &#xff0c;输入 gpedit.msc 在 本地组策略编辑器 中找到 计算机配置 > 管理模板> Windows 组件 > OneDrive&#xff0c;找到 禁止使用 OneDrive 进行文件存储 然后双击 禁止使用 OneDrive 进行文件存储&#xff0c;将中改为 已禁用&#xff0c;点击应用并…

CSS核心使用一

CSS核心使用一 box-sizingbox-shdowtext-shadowpositionwriting-mode box-sizing 定义计算一个元素的总高度和总宽度. 属性值 content-box 默认值,width 内容宽度,height内容的高度border-box 宽度和高度包含内容,内边距和边框 widthborderpadding内容宽度, heightborderpad…

迁移学习和多任务学习

迁移学习&#xff08;Transfer Learning&#xff09; 深度学习中&#xff0c;最强大的理念之一就是&#xff0c;有的时候神经网络可以从一个任务中习得知识&#xff0c;并将这些知识应用到另一个独立的任务中。 例如&#xff0c;你已经训练好一个能够识别猫的图像的神经网络&a…

软件设计模式系列之四——简单工厂模式

1 模式的定义 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;用于对象的创建&#xff0c;它属于工厂模式的一种。简单工厂模式的主要目标是封装对象的创建过程&#xff0c;使客户端代码与具体类的实例化解耦&#xff0c;从而提…