为 Fortran 数组操作指定冒号

2023-12-07

Fortran 允许更轻松地使用数组操作。例如,

double precision :: a(3,3), b(3,3), c(3,3)

Given a and b已初始化,我知道一个简单的c=a+b将导致矩阵加法。使用同样可以实现c(:,:) = a(:,:)+b(:,:)。我知道第二种方法允许使用适当的索引来切片数组。除此之外,这两种方法还有什么区别吗?是否应该优先选择某种特定方法?


在表达式中

c = a + b

参考文献a, b and c are to 整个数组. In

c(:,:) = a(:,:) + b(:,:)

参考文献a(:,:), b(:,:) and c(:,:) are to 阵列部分。这些是不同的事情。

一般来说,数组部分不具有整个数组的属性:如果c即使这样也是一个指针或可分配数组c(:,:)不是。当分配时可能发生重新分配时,这一方面最为显着。

In c=a+b c可能未分配,并将在响应中分配,但在c(:)=... c必须在分配之前进行分配。如果c按分配时间分配c=...那么如果出现以下情况,它将被释放:

  • 右侧的形状与c; or
  • 右侧的任何长度类型参数都与c; or
  • c是多态的,并且具有不同的动态类型或右侧表达式的相应种类类型参数不同于c.

如果存在这样的释放那么c被重新分配以匹配右侧表达式。

对于数组部分,不存在这样的自由:c(:)必须适当地匹配右侧表达式,或者必须有适当的可用转换(包括替代定义的赋值)。

从整个数组和数组部分的区别来看,还存在其他方面的问题。

在问题的特定上下文中,数组是显式形状的,那么就不用担心了。

就风格而言,人们可能会认为使用数组部分可以为代码的人类读者增加清晰度,因为“这是一个数组赋值”,或者使用整个数组来帮助编译器优化数组操作。这些之间的平衡取决于具体情况,King 指出相关问题其中考虑了性能方面。

此外,由于上面提到的释放/重新分配,编译器必须对可分配整个数组的内部赋值执行(可能昂贵的)形状/类型/类型参数检查(以确定是否必须发生释放)。使用数组部分意味着这些测试不是必需的。例如,与

c(:,:) = array_expr

程序员保证数组表达式array_expr形状与c(如果不是这种情况,则该片段不能是有效的 Fortran)并且编译器不需要运行释放检查。同样,使用它是根据个人情况进行选择。 (另请注意,编译器可能会提供运行时检查,以查看此类表达式是否匹配:如果使用此“技巧”,则应禁用这些检查。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 Fortran 数组操作指定冒号 的相关文章

随机推荐

  • 为什么十六进制字节数据 b'\x35' 在 Python 中被解释为 b'5'?

    我正在处理一组十六进制数据 我使用字节类型作为数据 例如 我的数据为b x35 b xA6 b x12 b x26 当我打印每个十六进制字符时 我得到的输出为b 5 b xa6 b x12 b 相应地 我正进入 状态b xa6 b x12
  • jQuery:tablesorter 插件,禁用某些列的排序

    我正在尝试禁用 3 列表中一列的排序 根据文档我想出了这个 table sortable tablesorter sortList 0 0 0 0 0 0 textExtraction myTextExtraction headers 0
  • MapReduce问题

    我有一个奇怪的 MapReduce 问题 地图功能 gt mp function emit this ContractID qty this Qty qtybs this QtyBs 减少功能 gt red function key val
  • Swift 中的“advancedBy”不可用

    我不确定如何解决上述错误消息 我尝试将其转换为索引 但它似乎不接受字符串 我不知道如何advancedBy也有效 非常感谢帮助 在斯威夫特 3 中 advancedBy 已更名为advanced by Int 此外 substringWit
  • 会话超时后自动重定向到登录

    我试图在会话超时后自动重定向到我的登录页面 我尝试在我的 Main Master 页面中添加此代码 所有其他页面都连接到此母版页 protected void Page Load object sender EventArgs e Redi
  • WCF中服务应用的架构

    我需要一些有关 WCF 应用程序架构的帮助 这将是许多应该可用于服务许多不同客户的服务 例如 ASP Net 应用程序 JavaScript 和 或 Silverlight iPhone 视窗手机 Android 有些服务需要身份验证 有些
  • 总结为每组赋予相同的值

    使用代码获取每个物种的平均花瓣长度 group sp lt group by iris iris Species mean plength lt summarise group sp mean iris Petal Length mean
  • Spring MVC Java 配置

    我想从 Spring Web 应用程序设置一个简单的响应主体 我的问题很简单 就是出现网络错误 我的 POM xml 是
  • SQL Server 数据库项目构建期间使用错误的编译器

    我在使用 Visual Studio 2015 编译 SSDT SQL Server 数据库项目时遇到问题 我想在我的数据库项目中使用 C 6 功能 但它似乎不受支持 例如 我在我的数据库项目中添加了下一个类 namespace Datab
  • JSR303 复合注释

    我创建了一个由 Digits 和 Min 组成的复合注释 Digits integer 12 fraction 0 Min value 0 ReportAsSingleViolation Documented Retention Reten
  • 在 AS3 中设置属性是否会阻止时间线补间?

    如果我有一个分配有类的影片剪辑 并且我在代码中更改了该影片剪辑的属性 则该属性似乎无法再在时间轴上进行补间 例如 如果我的类设置 this x 100 并且稍后在时间轴上补间对象的位置 则不会发生该时间轴补间 更改scaleX或scaleY
  • 将 DateTime 分组为 5、15、30 和 60 分钟间隔

    我尝试将一些记录分组为 5 分钟 15 分钟 30 分钟和 60 分钟间隔 SELECT AVG value as AvgValue sample date 5 60 as TimeFive FROM DATA WHERE id 123 A
  • ConfBridge:当管理员用户退出时结束会议

    这几天我在做一些关于ConfBridge的事情 当管理员用户退出时 我使用 confbridge kick all 结束会议 但会议中的其他人会听到 您已被踢出此会议 这不是结束会议的好方法 是否有任何配置或命令可以设置会议在管理员用户退出
  • javascript 中有没有一种好方法可以从 javascript 对象(而不是数组)中删除 Falsy 值?

    在 JavaScript 中 您可以使用很好的 filter 方法从数组中删除 null 或 false 值 到目前为止 我还没有找到从 JavaScript 对象中删除相同内容的方法 为什么会这样呢 目前 您可以为数组创建一个函数 例如
  • 管理 FCM 设备组

    我试图弄清楚如何使用 REST API 从应用程序服务器管理 FCM 设备组 AFAIK 这些是更新的文档 https firebase google com docs cloud messaging android device grou
  • jQuery:如何创建元素然后将其包装在另一个现有元素周围?

    所以我知道如何使用 wrap wrapInner and wrapAll但我想知道如何将 jQuery 1 4 中引入的快速创建语法和包装函数一起使用 基本上我希望能够使用 var targetUl this would be popula
  • 阻止谷歌翻译翻译日期选择器

    http jsfiddle net tkRaQ 51 这里的 addClass datepicker datepicker addClass notranslate 没有修复它 谷歌翻译停止工作日期的选择 由于某种原因 其他代码修复了它 f
  • 没有窗口的 Windows 应用程序中的窗口消息

    我有一个应用程序想要在后台运行 没有可见的窗口或控制台 为了实现这一点 我创建了一个 Windows 应用程序 但不创建窗口 当请求关闭时 即当用户注销时 应用程序需要进行一些清理 如何确定何时关闭 我可以简单地创建一个处理 WM CLOS
  • JS,数组矩阵和forEach行为的区别

    我正在为我的 JS 课程做一些培训任务 我得到一个必须实现一个函数的函数 该函数接受正整数 n 并返回如下所示的矩阵 已传递 5 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 我能够使用
  • 为 Fortran 数组操作指定冒号

    Fortran 允许更轻松地使用数组操作 例如 double precision a 3 3 b 3 3 c 3 3 Given a and b已初始化 我知道一个简单的c a b将导致矩阵加法 使用同样可以实现c a b 我知道第二种方法