对不同数据文件中的行进行求和

对不同数据文件中的行进行求和

我有一定数量的输入文件 (.txt),用于最终定义我的轴环境的 y 数据。x 数据来自不同的文件。目标是将输入文件的每一行相加(对于我的 y 数据是必需的)并将它们乘以例如 -1。

因此我的 Y 数据所需的文件可能如下所示:

\begin{filecontents}{n1b1_f1.txt}
2
3
\end{filecontents}

\begin{filecontents}{n1b2_f1.txt}
4
5
\end{filecontents}

\begin{filecontents}{n1b3_f1.txt}
6
7
\end{filecontents}

\begin{filecontents}{n1b4_f1.txt}
8
9
\end{filecontents}

X 数据的文件如下

\begin{filecontents}{X.txt}
1
2
\end{filecontents}

现在的最终目标是绘制一个 xy 图,其中x(i)=X(i)给出当前线的编号。y(i)=(n1b1_f1(i)+n1b2_f1(i)+n1b3_f1(i)+n1b4_f1(i))*-1i

我的 y 数据所需的输入文件数量可能会发生变化,但不会超过 9,现在的问题在于我是否必须“手动”进行此类采用

我一般不知道之前的行数。我必须查找它们,但如果它可以自动处理任意行数,那就太好了。

答案1

这是一个新宏\mergetables{<list of table names>}{<output table>},您可以使用它将多个表合并为一个。在您的示例中,您可以使用

\mergetables{X, n1b1_f1, n1b2_f1, n1b3_f1, n1b4_f1}{\datatable}

假设文件名为X.txtn1b1_f1.txt等。在你的图中,你可以使用类似

\addplot table [y expr=(\tr{n1b1_f1}+\tr{n1b2_f1}-\tr{n1b3_f1})*-1]{\datatable};

将三列相加并乘以-1

\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\usepackage{filecontents}

\begin{filecontents}{X.txt}
1
2
3
\end{filecontents}

\begin{filecontents}{n1b1_f1.txt}
2
3
5
\end{filecontents}

\begin{filecontents}{n1b2_f1.txt}
4
5
8
\end{filecontents}

\begin{filecontents}{n1b3_f1.txt}
6
7
2
\end{filecontents}

\begin{filecontents}{n1b4_f1.txt}
8
9
1
\end{filecontents}

\newcommand{\mergetables}[2]{
    \newif\iffirstrow
    \firstrowtrue

    \pgfplotsforeachungrouped \tablename in {#1}{
        \iffirstrow
            \pgfplotstableread{\tablename.txt}\temptable
            \pgfplotstabletranspose[input colnames to=colnames]{\temptabletransposed}{\temptable}
            \pgfplotstablemodifyeachcolumnelement{colnames}\of\temptabletransposed\as\cell{%
                \edef\cell{\tablename}%
            }
            \firstrowfalse
        \else
            \pgfplotstableread{\tablename.txt}\temptable
            \pgfplotstabletranspose[input colnames to=colnames]{\temptabletransposedcur}{\temptable}
            \pgfplotstablemodifyeachcolumnelement{colnames}\of\temptabletransposedcur\as\cell{%
                \edef\cell{\tablename}%
            }
            \pgfplotstablevertcat{\temptabletransposed}{\temptabletransposedcur}
        \fi
    }
    \pgfplotstabletranspose[colnames from=colnames, input colnames to=]{#2}{\temptabletransposed}
}
\def\tr{\thisrow}


\mergetables{X, n1b1_f1, n1b2_f1, n1b3_f1, n1b4_f1}{\datatable}


\begin{document}


\begin{tikzpicture}
\begin{axis}[ xlabel=$x$, ylabel=$y$]
    \addplot table [y expr=(\tr{n1b1_f1}+\tr{n1b2_f1}-\tr{n1b3_f1})*-1]{\datatable};
\end{axis} 
\end{tikzpicture}
\end{document}

相关内容