gpt4 book ai didi

linux - 使用 shell 脚本读取矩阵的所有条目

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:14 25 4
gpt4 key购买 nike

我有一个矩阵,

A(i,j), i=1,m and j=1,n

我可以用 C 和 FORTRAN 读取它,但我不能用 shell 脚本读取它。我知道这是一个非常简单的问题,但我对 shell 脚本还很陌生。我想阅读所有条目并进行一些计算,例如我有一个矩阵:

A= 1 0 1 1
2 1 0 2
1 0 0 3
1 2 3 0

现在我想将每个 0 与其上、下、左、右值进行比较。最后,我想对每个零周围的这四个值进行一些计算(比如说求和)。在上面的示例中,结果将是 - 对于五个零

1st zero: 3
2nd zero: 4
3rd zero: 4
4th zero: 6
5th zero: 6

所以在 FORTRAN 中,我可以通过读取所有值来做到这一点

do j=1,n
do i=1,m
if (A(i,j) .eq. 0) then
B(i,j)=A(i-1,j)+A(i+1,j)+A(i,j+1)+A(i,j-1)
enddo
enddo

但我想在 shell 脚本中完成。怎么办?

最佳答案

假设数据在“test.dat”中给出(没有“A =”),我还是试过了......

#!/bin/bash                                                                       
inpfile="test.dat"

L=100 # some large value
for (( i = 0; i < L; i++ )) {
for (( j = 0; j < L; j++ )) {
A[ L * i + j ]=0
}
}

i=1
while read buf; do
inp=( $buf ); n=${#inp[@]}
if (( L <= n+1 )); then echo "L is too small"; exit -1; fi

for (( j = 1; j <= n; j++ )) {
A[ L * i + j ]=${inp[j-1]}
}
(( i++ ))
done < $inpfile

nzeros=0
for (( i = 1; i <= n; i++ )) {
for (( j = 1; j <= n; j++ )) {
if (( ${A[ L * i + j ]} == 0 )); then
(( nzeros++ ))
B[ nzeros ]=$(( \
${A[ L * (i-1) + j ]} + \
${A[ L * (i+1) + j ]} + \
${A[ L * i + j+1 ]} + \
${A[ L * i + j-1 ]} ))
fi
}
}

for (( k = 1; k <= nzeros; k++ )) {
printf "%dst zero: %d\n" $k ${B[k]}
}

结论:非常痛苦。推荐使用 Fortran...(如预期)

关于linux - 使用 shell 脚本读取矩阵的所有条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30396462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com