使用 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...(符合预期)
我有一个矩阵,
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...(符合预期)