2014-10-29 23 views
0

我想用脚本减去两个矩阵的值。我的文件具有.dat或.ext扩展名。我相信我可以在脚本中使用一个简单的命令,我可以使用它。我搜索了很多,但唯一发现的是diff命令,我只能找到并打印两个文件之间不同的元素。 我的文件在第一列中有日期和其余列值。我想在另一个文件中写入减去这两个矩阵的结果,但保留第一列。谢谢。使用Linux脚本减去两个矩阵

文件的结构是这样的:

文件1

1890 0.6 0.7 0.0 

1910 0.3 0.4 0.2 

2100 0.2 0.9 0.3 

文件2

1890 0.3 0.3 0.0 

1910 0.2 0.2 0.1 

2100 0.1 0.1 0.1 

我想与文件3

落得

文件3

1890 0.3 0.4 0.0 

1910 0.1 0.2 0.1 

2100 0.1 0.8 0.2 

我想这在我的脚本:File3 = $File1 - $File2 | cat $File3

+1

什么是 “抽象的” 荷兰国际集团的矩阵? – 2014-10-29 09:41:24

+0

http://en.wikipedia.org/wiki/Matrix_(mathematics) – Maria 2014-10-29 09:46:23

+0

我知道什么是矩阵。但是抽象矩阵是什么? – 2014-10-29 09:47:28

回答

1

这里是一个解决方案使用bash:

#! /bin/bash 

file1="file1.txt" 
file2="file2.txt" 
file3="file3.txt" 

echo "Reading input files" 
readarray -t mat1 < "$file1" || exit 1 
readarray -t mat2 < "$file2" || exit 1 

echo "Creating result" 
>| "$file3" || exit 1 

# Line number 
n1=${#mat1[*]} 
n2=${#mat2[*]} 
((n = n1<n2 ? n1:n2)) 

for ((i=0; i<n; i++)); do 
    line1=(${mat1[i]}) 
    line2=(${mat2[i]}) 

    line3=(${line1[0]}) 

    for ((j=1; j<=3; j++)); do 
     line3+=($(echo "${line1[j]}-${line2[j]}"|bc)) 
    done 

    echo "${line3[@]}" >> "$file3" 
done 

echo "done" 
exit 0 
+0

'bc'不打印'0.5'但是'.5'。如何获得'0.5'? – 2014-10-29 15:59:54

+0

非常感谢Edouard Thiel,这正是我所寻找的。我还在几分钟前发现了user000001:paste文件{1,2} |使用awk的解决方案awk'{for(i = 1; i <= NF/2; i ++)printf“%s”,($ i == $ i + 0)?$ i - $(i + NF/2):$ i;打印“”}“。我只是重复它作为评论,以防有人看到这篇文章。 – Maria 2014-10-29 16:18:38

1

Linux的脚本? 它可能是python,perl,shell,bash或者ruby .. etc脚本。

我建议使用Python与numpy的:

但在此之前,你应该阅读第一,你有你的矩阵,以在脚本中的局部变量的第二个文件。

你的文件应该尊重这种格式:

[[0, 1, 3], 
[0, 1, 2], 
[0, 1, 0]] 

和你的Python脚本应该是这样的

#!/usr/bin/env python 
import numpuy as np 

val1 = ''.join(open('file1', 'r').readlines()) 
val2 = ''.join(open('file2', 'r').readlines()) 

mat1 = np.matrix(val1) 
mat2 = np.matrix(val2) 

#I am not sure about this but try it 
mat3 = mat1 - mat2 

你也可以考虑阅读文件阵列,具有以下阵列格式:

((2,3), (3, 5)) 

例如:

mat1 = np.array(val1) 
mat2 = np.array(val2) 
print (mat1-mat2) 

如果你不熟悉python,去to或搜索一些初学者的教程。