![编辑](https://linux22.com/image/306277/%E7%BC%96%E8%BE%91.png)
我正在使用“功能”\findmin
和findmax
我正在使用这里从我读入的 CSV 数据中,可以非常方便地采用动态格式并设置图表。
同样,我想要一个函数\findFirstNonZeroIndex
,它返回指定列中第一个非零元素的整数索引。由于我的所有数据都是非负整数,因此非零等于大于 0。
由于索引pgfplotstable
从 0 开始,我如何将 1 加到这个数字上?
来自pgfplotstable 手册,该iflessthan
命令似乎能够完成我想要做的事情:
\pgfplotstablesort[sort key={#2},sort cmp={
iflessthan/.code args={#1#2#3#4}{%
% here comes your code
}%
}]{\result}{\datatable}
一些示例数据:
\begin{filecontents}{table.dat}
x y
1 0
2 0
3 30
4 0
5 50
\end{filecontents}
如果可能的话,我确实只想使用列 = y
=index[1]
并得到类似的结果\findFirstNonZeroIndex{\inputtable}{\outputvalue}
。在这个例子中,\outputvalue
应该是 3。
如果更简单的话,到目前为止,我只使用y
按升序排序的列中的整数值。因此,行 x=4 中不会有 0。
我只是不太清楚如何开始。任何帮助我都会很感激。
编辑
Steven B. Segletes 刚刚已回答我的问题借助包来解决readarray
。
出于好奇,是否有使用 pgf 框架的解决方案?
答案1
以下是使用 PGFPlotstable 执行此操作的方法。我定义了一个宏,它有三个参数:包含使用 加载的表的宏\pgfplotstableread
、列的名称以及包含输出的宏。请注意,PGFPlotstable 使用从零开始的索引,因此如果第一个非零元素位于第三行,则输出将为2
。如果未找到非零值,则输出将为-1
。
\documentclass{article}
\usepackage{filecontents}
\usepackage{pgfplotstable}
\begin{filecontents}{table.dat}
x y
1 0
2 0
3 30
4 0
5 50
\end{filecontents}
\newcommand\findFirstNonZeroIndex[3]{
\def#3{-1}
\pgfplotstableforeachcolumnelement{#2}\of{#1}\as\cell{
\ifnum#3=-1
\ifnum\cell>0
\xdef#3{\pgfplotstablerow}
\fi
\fi
}
}
\begin{document}
\pgfplotstableread{table.dat}\datatable
\findFirstNonZeroIndex{\datatable}{y}{\outputvalue}
\outputvalue
\end{document}
答案2
宏\firstdata{
列}
将在指定列中查找第一个正值条目(从第 2 行开始,因为第 1 行是字母)。找到后,它将输出该行第 1 列的值,在数据结构中,该值是数据点编号。
因此,该MWE输出结果3
。
该readarray
包将文件存储在一个大的 中\def
,在本例中为 。然后,它通过读取一个 2 列空格分隔值的数组来\mydata
创建一个数组结构,此处名为。可以调用数组中的各个单元格并将其与 进行比较以检测阳性。thedata
\mydata
\arrayij{thedata}{row}{column}
0
\documentclass{article}
\usepackage{readarray,filecontents,ifthen}
\begin{filecontents*}{table.dat}
x y
1 0
2 0
3 30
4 0
5 50
\end{filecontents*}
\readdef{table.dat}{\mydata}
\readArrayij{\mydata}{thedata}{2}
\newcounter{currentrow}
\def\firstdata#1{%
\setcounter{currentrow}{1}%
\whiledo{\value{currentrow}<\thedataROWS}{%
\stepcounter{currentrow}%
\ifnum\arrayij{thedata}{\thecurrentrow}{#1}>0
\arrayij{thedata}{\thecurrentrow}{1}%
\setcounter{currentrow}{\thedataROWS}%
\fi%
}%
}
\begin{document}
\firstdata{2}
\end{document}