Как отобразить значения данных на colormap / colorbar в Matlab

Вы должны гордиться, когда используете что-то настолько прекрасное, как boost::spirit

. Здесь моя попытка парсера (почти), соответствующая спецификациям CSV по этой ссылке спецификациям CSV (Мне не нужны разрывы строк в полях, а также пробелы в запятых).

После того, как вы преодолеете шокирующий опыт ожидания 10 секунд для компиляции этого кода :), вы можете сидеть сложа руки и

// csvparser.cpp
#include 
#include 

#include 
#include 

namespace qi = boost::spirit::qi;
namespace bascii = boost::spirit::ascii;

template 
struct csv_parser : qi::grammar(), 
    bascii::space_type>
{
    qi::rule COMMA;
    qi::rule DDQUOTE;
    qi::rule non_escaped;
    qi::rule escaped;
    qi::rule field;
    qi::rule(),  bascii::space_type  > start;

    csv_parser() : csv_parser::base_type(start)
    {
        using namespace qi;
        using qi::lit;
        using qi::lexeme;
        using bascii::char_;

        start       = field % ',';
        field       = escaped | non_escaped;
        escaped     = lexeme['"' >> *( char_ -(char_('"') | ',') | COMMA | DDQUOTE)  >> '"'];
        non_escaped = lexeme[       *( char_ -(char_('"') | ',')                  )        ];
        DDQUOTE     = lit("\"\"")       [_val = '"'];
        COMMA       = lit(",")          [_val = ','];
    }

};

int main()
{
    std::cout << "Enter CSV lines [empty] to quit\n";

    using bascii::space;
    typedef std::string::const_iterator iterator_type;
    typedef csv_parser csv_parser;

    csv_parser grammar;
    std::string str;
    int fid;
    while (getline(std::cin, str))
    {
        fid = 0;

        if (str.empty())
            break;

        std::vector csv;
        std::string::const_iterator it_beg = str.begin();
        std::string::const_iterator it_end = str.end();
        bool r = phrase_parse(it_beg, it_end, grammar, space, csv);

        if (r && it_beg == it_end)
        {
            std::cout << "Parsing succeeded\n";
            for (auto& field: csv)
            {
                std::cout << "field " << ++fid << ": " << field << std::endl;
            }
        }
        else
        {
            std::cout << "Parsing failed\n";
        }
    }

    return 0;
}

Компиляция:

make csvparser

Тест (пример украден из Wikipedia ):

./csvparser
Enter CSV lines [empty] to quit

1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
Parsing succeeded
field 1: 1999
field 2: Chevy
field 3: Venture "Extended Edition, Very Large"
field 4: 
field 5: 5000.00

1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00"
Parsing failed

0
задан Alberto 5 March 2019 в 12:05
поделиться

1 ответ

Цветовая карта будет автоматически установлена ​​на значения ваших данных. Ваши данные находятся в диапазоне [0 2], поэтому они установлены на это. Чтобы сделать то, что вы хотите, вам нужно насытить вашу цветовую карту, это будет означать, что она будет отображаться с белого на черный в [0 1], но это будет просто черный в [1 2]. В общем, это плохая наука, вы вводите читателя в заблуждение относительно реальной стоимости поверхности / изображения.

Однако, если у вас есть подлинная причина сделать это, то команда будет caxis([0 1])

0
ответ дан Ander Biguri 5 March 2019 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: