编辑

编辑

我正在使用“功能”\findminfindmax我正在使用这里从我读入的 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}

相关内容