fortran - 从数组 A 复制不在数组 B 中的元素
问题描述
假设A
是一个非重复整数的一维数组,并假设它B
表示 的一个真子集A
。是否有一个 Fortran 单线,可能使用掩码来选择A
不在的元素B
?B
我的意思是,我想要关于的集合论补集A
。
例如,给定A = [ 0, 1, 2, 3, 4, 5 ]
和B = [ 1, 2, 4 ]
,给我C = [ 0, 3, 5 ]
。
显然这可以通过显式循环来完成,但我试图避免这种情况。
解决方案
是否有可能使用掩码的 Fortran 单行程序来选择 A 中不在 B 中的元素?
就在这里:
pack(a, [(all(b /= a(i)), i=1, size(a))])
或等价物:
pack(a, .not.[(any(b == a(i)), i=1, size(a))])
但是,请记住来自@francescalus 和@HighPerformanceMark 的评论,关于您为什么想要单线?:
- 为了清楚起见:老实说,这条单线的意图非常明确。在这种情况下,可能不需要自定义函数/运算符,除非您多次执行此操作或想要隐藏不同的(更高效,但不是单行)实现。
- 为了性能:
a(i) == b
为. 然后,它创建一个临时维度数组作为函数的掩码,并遍历它(归约)以构造具有最终大小的结果数组。如果值得的话(非常大的数组),您可以轻松地提出一种性能更高的算法。size(b)
a
size(a)
pack
提示:您可能需要一个可分配的数组来存储结果,一旦您事先不知道结果数组的大小(Fortran 2003的自动数组分配功能在这里会很方便)。另一种选择是将大小为 minimun 的容器数组作为第三个参数传递给 pack 函数size(a)
。
推荐阅读
- python - 测试使用 TemporaryUploadedFile 的视图
- ios - WatchKit 应用的 Info.plist 中的 WKCompanionAppBundleIdentifier 键不能用于独立的 WatchKit 应用
- reactjs - FluentUI - Pivot 和 PivotItem - onLinkClick 有效,但 onClick 无效?
- python - 在 pytorch ImageFolder 中创建新的观察结果
- c++ - 有人可以帮我指出我的代码在输出中哪里出错了吗?
- amazon-emr - EMR 失败并出现错误:无法执行 HTTP 请求:超时等待来自池的连接
- linux - 无法在单个 VM 上启动 Openshift Origin 3.11
- reactjs - 切换路由时 React 不会重新运行 App() 函数
- spring-cloud - springcloud 中的服务是什么?
- uno-platform - UNO解决方案需要很长时间才能构建