arrays - 在 Fortran 中选择给定逻辑向量的数组的子集

标签 arrays fortran logical-operators

在 Fortran 中,是否可以通过使用一些逻辑值向量而不是索引来选择数组的某些部分?例如像这样:

iszero(1) = 0
iszero(2) = 1
iszero(3) = 0
sum0 = sum(iszero) !was  sum0 = sum(iszero==0)
!mymatrix is arbitary is 3 times 3 array
mysubmatrix(1:sum0,1:sum0) = mymatrix(iszero==0,iszero==0)
call dtrmv('l','n','u',sum0,mysubmatrix(1:sum0,1:sum0),sum0,x(1:sum0)),1)

如果这不能直接实现,是否有一种简单(快速)的方法可以找到 iszero=0 的索引?

编辑:我更改了示例以呈现更现实的情况,在以前的情况下,我只是将一些值更改为 100.0d0,其中元素处理本来可以..

edit2:在代码的第四行有一个类型

最佳答案

where (mymatrix==0) mymatrix = 100.0d0

将 mymatrix 中的所有元素设置为 0 到 100。如果您实际上想做一些比这更复杂的事情,也许将矩阵设置为具有 1 和 0 的“棋盘”,您可以尝试类似的方法;
mymatrix(1:m:2,2:n:2) = 100d0

其中 m,n 是 mymatrix 中的行数和列数。我还没有测试过后一个片段,这只是建议有时考虑数组下标三元组。

编辑

如果您确实想在 where 语句中使用一个矩阵(或向量)作为掩码,而在赋值部分中使用另一个矩阵(或向量),例如:
where(index_matrix==0) mymatrix = 100d0

那么你(我认为)必须确保 index_matrix大小与 mymatrix 相同.在您的情况下,您可能会得到如下语句:
where(reshape([0,1],[3,3],pad=[0,1])==0) mymatrix = 100d0

同样,我还没有测试过这个,我不希望我的填充 reshape 非常正确,但你可能会弄清楚细节。

进一步编辑

我现在发现很难回答这个问题。该声明
sum0 = sum(iszero==0)

将值 1 赋给 sum,所以语句
mysubmatrix(1:sum0,1:sum0) = mymatrix(iszero==0,iszero==0)

在运行时,将是这样的:
mysubmatrix(1:1,1:1) = mymatrix(iszero==0,iszero==0)

而且我不确定 rhs 和 lhs 是否适合 Fortran。这能编译吗?如果是,它是否正确执行(使用数组边界检查)?

您是否正在尝试创建 submatrix它只包含 mymatrix 的 0 个元素?如果是这样,那么对于一般情况,我认为您会遇到困难。除非您可以根据索引或下标向量或下标三元组来定义要选择的元素的位置,否则我不认为您可以从 rhs 上的数组创建 lhs 上的数组。

如果 0 的位置是任意的,那么您可以通过将原始数组展平为 1 级并创建其 1 级子数组来执行您想要的操作,但是您将丢失 2D 位置与其 1D 对应位置之间的对应关系.

最后

不要忘记,在 Fortran 2003 中,您可以使用指针来引用由向量或三元组下标定义的子矩阵,例如
pointer_to_array => target_array(1:10:2,2:10:2)

然后通过 pointer_to_array大约。

关于arrays - 在 Fortran 中选择给定逻辑向量的数组的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786910/

相关文章:

arrays - 如何知道 Fortran 数组中非零元素的个数?

algorithm - 在 Fortran 中使用蒙特卡罗方法估计 pi

regex - sed 正则表达式中的 bool 或

Fortran:(错误)匹配动态类型

r - 根据条件将命名数值向量(按升序)转换为命名逻辑向量

arrays - MATLAB 中异构元胞数组中字符的逻辑索引

javascript - 为什么 'next button' 不能在较小的屏幕上工作?

c - 在C语言中,如何将数组传递给函数?

javascript - 获取 JavaScript 数组的键和值到变量中

JQuery inArray 显示选择图像的顺序