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

Read all the entries of a matrix using shell script

我有一个矩阵,

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...(符合预期)