Fortran - 逻辑索引

2024-02-27

假设我有一个矩阵A这是(m x n)和一个向量B这是(m x 1)。这个向量B是一个由 0 和 1 组成的向量。

还让标量s是其中元素的总和B .

我想创建一个矩阵C这是s x n对应于行B等于 1,并且是一个向量D即 s x 1,这些元素的位置在A.

Take as an example: 

      A = [1, 2, 3; 
           4, 5, 6; 
           7, 8, 9; 
           10, 11, 12; 
           13, 14, 15 ]

        B = [0; 1; 0; 1; 1]

    Then:
C = [ 4, 5, 6; 
     10, 11, 12; 
     13, 14, 15 ]
and
D = [2; 
     4
     5]

到目前为止,我的 Fortran 代码如下所示:

PROGRAM test1
IMPLICIT NONE

 REAL, DIMENSION(5,3) :: A
INTEGER, DIMENSION(5,1) :: B = 0
INTEGER :: i, j, k

k = 1

!Create A matrix
do i=1,5
    do j=1,3
        A(i,j) = k
        k = k+1
    end do
end do

!Create B matrix
B(2,1) = 1
B(4,1) = 1
B(5,1) = 1


end program

在 matlab 中,我可以简单地通过创建 C = A(逻辑(B),:) 和 D 以类似的方式创建 C。

我怎样才能在 Fortran 中做到这一点,避免循环?我已经调查过where and forall陈述,但它们并不完全是我正在寻找的。


正如 @francescalus 所建议的,PACK内在函数在 Fortran 中相当于 Matlab 逻辑切片,但只是部分功能。 Matlab 逻辑索引有两种类型:

  • 整个数组逻辑索引:掩码必须与数组具有相同的形状,并且返回值的等级为 1(Matlab 中的向量)。之所以如此,是因为真值的位置是任意的,因此你不能保证在矩阵中打孔的结果基本上是矩形的。这就是 PACK 在 Fortran 中所做的事情.

    c = a(a < 1); % Matlab: a(m,n) -> c(s)
    C = PACK(A, A < 1) ! Fortran: A(m,n) -> C(s)
    
  • 单维逻辑索引:掩码必须是一维的,用于在数组的单个维度内进行选择。其他维度可以选择整体或带有自己的索引。这就是你想要的.

    b = a(:,1) > 0; % a(m,n) gives logical b(m)
    c = a(b,:); % a(m,n) selected with b(m) -> c(s,n)
    

然而,PACK并不直接承认这种用法。 @high-performance-mark 的解决方案向您展示了如何实现这一壮举:SPREAD基本上是repmat,所以他的解决方案在 Matlab 中如下所示:

b = a(:,1) > 0; % a(m,n) gives logical b(m)
bMat = repmat(b, 1, size(a,2)); % n copies of b(m) -> bMat(m,n)
c = reshape(a(bMat), [sum(b), size(a,2)]); % a(m,n) -> c(s,n)

需要最终重塑的地方,因为a(bMat)由于使用了整体矩阵选择形式,所以不是矩阵,而是大小为 s*n 的向量。另一个答案的 Fortran 代码正是这样做的:

c = RESHAPE( &
        PACK(a, & ! The matrix we are selecting from
            SPREAD(b==1, ! The == 1 is because you were using an INTEGER array, not LOGICAL
                   dim=2, ncopies=SIZE(a,2)) & ! This is the repmat-like code
        ), & ! The result of this PACK is cVec(s*n)
        [COUNT(b==1),SIZE(a,2)]) ! Reshape into (s,n)

分配给 D 的代码非常相似,但我们不是使用 A,而是从动态生成的数组中进行选择,该数组包含从 1 到 A 第一个维度的长度的数字(与 A 的第一维长度相同) B) 的大小。这次不需要对结果进行任何掩码的 SPREAD 或 RESHAPE,因为源数组是一维的。

顺便说一下,Fortrandoes直接支持整数向量索引,因此您可以使用代码首先生成 D 向量(带有 B 的真实元素的索引),然后then do:

C = A(D,:) ! Works the same in Fortran!

避免传播和重塑。

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

Fortran - 逻辑索引 的相关文章

随机推荐

  • 在 Java 中通过 CrossOrigin 注解或在 Spring-Config XML 中使用 Spring 属性

    我在Spring中使用CrossOrigin注释 现在我想将属性作为值注入到注释中 我无法让这个工作 现在我像这样访问我的财产 Value settings cors origin String cors origin 我想将此属性注入到
  • Bitbucket符号(箭头)含义

    箭头是什么意思 我对 git 或 bitbucket 并不陌生 但我认为我可能在最初的提交中搞砸了一些事情 我需要帮助来解决这个问题 我的本地存储库中的文件夹不是空的 而是将其拉到该文件夹 所在的另一个位置 是链接吗 不在我的本地仓库上 该
  • Angular NgRx - 继续轮询仅第一次调用的服务的效果

    我有一个应用程序 我刚刚添加了 NgRX 我希望使用效果来打开和关闭轮询 示例大纲 我跟着这个帖子 https bbonczek github io jekyll update 2018 03 01 polling with ngrx ht
  • Clickonce部署到多个环境

    我有一个 WPF 应用程序 想通过 ClickOnce 部署给我们的用户 我们有四种环境 系统测试 用户测试 并行生产和生产 每个都需要一个不同的配置文件 其中包含服务器名称和特定于环境的其他内容 因此它们不能全部使用相同的代码库 大部分代
  • AudioClip 的频率和音调关系 - Unity3D

    我正在尝试仅使用 6 个音频剪辑来重新创建吉他的完整音域 我在想有一种方法可以设置音频剪辑的频率 但audio Frequency仅返回基于压缩格式的音频频率 而不是实际的音调 我知道我可以阅读 GetSpectrumData 但该解决方案
  • 在 R 中,我们如何向 kable() 表添加重要性星星?

    使用knitr kable 函数通过rmarkdown创建 doc表 我们如何从给定的数据帧 df b 添加 重要性星星符号 i e cutpoints c 0 001 01 05 1 1 symbols c 接近存储在另一个数据帧 df
  • Spring Boot 单元测试自动装配

    我有以下课程 应用和配置类 package mypackage service import mypackage service util MyUtility import org springframework boot SpringAp
  • Charles proxY:在 https 上重写不起作用

    我正在使用 Charles Proxy 重写网站上的代码 只是为了测试客户的网站 重写适用于除 https 网站之外的所有网站 Charles 可以选择协议 http 或 https 但这也不起作用 每次重写都在 http 上运行良好 而不
  • Firebase 查询 - 嵌套数据

    我正在尝试查询 firebase 中的一些分层数据 我在弄清楚如何查询以下数据结构时遇到了一些困难 orgs KBFXBBEyvgtfqMvU4pi name ACME 123 owner K9IPqIUIuEFzLS0f Pe users
  • 如何测试 Django 测试用例中是否记录了特定日志消息?

    我想确保代码中的某个条件会导致日志消息写入 django 日志 我如何使用 Django 单元测试框架来做到这一点 是否有地方可以检查记录的消息 类似于检查已发送的电子邮件 我的单元测试扩展了django test TestCase 使用m
  • 可滚动弹性盒中的多种背景颜色

    我有一个flexbox flex direction row 具有 2 列内容和固定高度 我希望左栏和右栏分别有红色和蓝色背景 如果任一列溢出 则flexbox的滚动条出现 溢出的部分仍然是红色 蓝色 如果列的内容高度小于flexbox的高
  • 预取指令是否需要在退出之前返回结果?

    在最新的 Intel 和 AMD CPU 上 已执行但请求的行尚未到达指定缓存级别的预取指令是否仍会退出 也就是说 预取的退休是 阻塞 的 因为它看起来对于加载来说是 阻塞 的 还是非阻塞的 关于英特尔处理器 没有 Intel优化手册第7
  • Python 使读取 Excel 文件更快

    我制作了一个读取 Excel 文档并检查第一行是否包含 UPDATED 的脚本 如果是这样 它将整行写入具有相同选项卡名称的另一个 Excel 文档 我的Excel文档有23张纸 每张纸有1000行 现在需要15分钟以上才能完成 有没有办法
  • 使用 Protocol Buffer 进行 Java 序列化

    我想在 Java 应用程序中使用 protobuf 来促进序列化 并且我对 Google 网站上的这段引用有疑问 协议缓冲区和 O O 设计 Protocol Buffer 类基本上是 哑数据持有者 如结构体 C 他们的头等舱成绩不好 对象
  • Asp.net从aspx中的文本框获取值到代码隐藏

    我正在使用 asp net 和 C 编程语言创建一个登录系统 处理用户和密码的代码已经完成 但在视图层中 我很难从用户名文本框和密码文本框中获取值并将其传递给代码隐藏 两个文本框均通过 ID 进行标识 根据我的编程技能 ID 应该足以访问元
  • 如何使用 JSDoc 记录 ECMA6 类?

    背景 我在 Nodejs 中有一个使用 ECMA6 类的项目 我正在使用JSDoc http usejsdoc org 评论我的代码 以便其他开发人员更容易访问它 然而 我的评论并没有被该工具很好地接受 而且我的文档也很糟糕 Problem
  • PHP UTF-8 转 GB2312

    我们的 Web 应用程序的一部分有一个小 Ajax 方法 可以在 iFrame 中加载页面或允许您下载它 我们存储来自搜索引擎的大量搜索结果 并使用脚本打开包含我们的信息和搜索 html 的文件 我们从顶部 我们的信息 中删除不需要的内容
  • 在 ARMv7 IMX6Q 板上运行 NodeJs 时出错,如何修复?

    我想要的是 我想在没有互联网但有网络连接的 ARMv7 freescale imx6q 板上运行 nodejs 我做了什么 我从nodejs官方下载中获取了预构建的二进制文件 提取它们并尝试运行节点二进制文件 但它会抛出错误 没有这样的文件
  • Eclipse IDE 无法启动,并且 JVM 已终止。退出代码=-1

    我遇到了 Eclipse IDE 无法启动的问题 并显示以下错误消息 JVM 终止 退出代码 1 经过一番谷歌搜索后 我半无意地找到了解决方案 并且能够让 IDE 正确启动 我所做的是将 eclipse ini 中的 Xmx JVM 参数设
  • Fortran - 逻辑索引

    假设我有一个矩阵A这是 m x n 和一个向量B这是 m x 1 这个向量B是一个由 0 和 1 组成的向量 还让标量s是其中元素的总和B 我想创建一个矩阵C这是s x n对应于行B等于 1 并且是一个向量D即 s x 1 这些元素的位置在