Скопируйте содержание streambuf в строку

Вы можете настроить это:

import matplotlib.pyplot as plt
import matplotlib
mat = [[ 150. ,  0.    ,   0.     ,  0.   , 0.   ,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.   ,    0.    ,   0.     ,  0.   ,  0.     ,  0.     ,  0.      , 0.     ,  0.   ],
       [ 150. , 69.388 ,  35.36   , 18.211, 7.851,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.    ,   0.   ,    0.     ,  0.   ,  -0.03  ,  -0.047 ,  -0.044  , -0.027 ,   0.   ],
       [ 150. , 92.192 ,  53.842  , 29.633,13.192,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.    ,   0.   ,    0.     ,  0.   ,  -0.075 ,  -0.112 ,  -0.104  , -0.062 ,   0.   ],
       [ 150. , 95.538 ,  58.184  , 33.287,15.285,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.    ,   0.   ,    0.     ,  0.   ,  -0.156 ,  -0.221 ,  -0.199  , -0.116 ,   0.   ],
       [ 150. , 81.776 ,  50.068  , 30.045,14.659,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.    ,   0.   ,    0.     ,  0.   ,  -0.331 ,  -0.416 ,  -0.357  , -0.203 ,   0.   ],
       [   0. , 31.498 ,  30.267  , 22.168,13.308,  5.653,    2.766  ,  1.5    ,  0.86  ,   0.492  ,  0.254  , 0.082, -0.058,   -0.182  , -0.298 ,  -0.41 ,   -0.515  , -0.617,  -0.751 ,  -0.754 ,  -0.609  , -0.34  ,   0.   ],
       [   0. , 13.948 ,  17.335  , 15.05 ,10.751,  6.537,    3.913  ,  2.374  ,  1.447 ,   0.854  ,  0.443  , 0.13 , -0.132,   -0.372  , -0.602  , -0.826 ,  -1.034  , -1.204,  -1.301 ,  -1.241 ,  -0.985  , -0.548 ,   0.   ],
       [   0. ,  6.958 ,  10.074  ,  9.949, 8.107,  5.832,    3.973  ,  2.635  ,  1.7   ,   1.034  ,  0.534  , 0.129, -0.229,   -0.57   , -0.913  , -1.258 ,  -1.59   , -1.864,  -2.007 ,  -1.924 ,  -1.543  , -0.866 ,   0.   ],
       [   0. ,  3.812 ,   6.053  ,  6.564, 5.896,  4.712,    3.511  ,  2.493  ,  1.685 ,   1.048  ,  0.529  , 0.079, -0.342,   -0.768  , -1.22   , -1.705 ,  -2.203  , -2.654,  -2.941 ,  -2.904 ,  -2.395  , -1.375 ,   0.   ],
       [   0. ,  2.237 ,   3.761  ,  4.358, 4.202,  3.609,    2.867  ,  2.142  ,  1.498 ,   0.943  ,  0.455  , 0.002, -0.452,   -0.94   , -1.495  , -2.139 ,  -2.864  , -3.607,  -4.2   ,  -4.357 ,  -3.76   , -2.237 ,   0.   ],
       [   0. ,  1.375 ,   2.396  ,  2.906, 2.943,  2.656,    2.206  ,  1.708  ,  1.223 ,   0.771  ,  0.345  ,-0.076, -0.526,   -1.045  , -1.682  , -2.491 ,  -3.509  , -4.71 ,  -5.895 ,  -6.563 ,  -6.052  , -3.812 ,   0.   ],
       [   0. ,  0.867 ,   1.543  ,  1.925, 2.009,  1.865,    1.592  ,  1.261  ,  0.915 ,   0.573  ,  0.232  ,-0.126, -0.531,   -1.031  , -1.698  , -2.633 ,  -3.971  , -5.831,  -8.105 ,  -9.948 , -10.073  , -6.958 ,   0.   ],
       [   0. ,  0.548 ,   0.986  ,  1.242, 1.302,  1.205,    1.035  ,  0.828  ,  0.604 ,   0.373  ,  0.134  ,-0.128, -0.441,   -0.852  , -1.445  , -2.372 ,  -3.911  , -6.536, -10.749 , -15.049 , -17.334  ,-13.947 ,   0.   ],
       [   0. ,  0.34  ,   0.609  ,  0.755, 0.751,  0.618,    0.516  ,  0.411  ,  0.299 ,   0.183  ,  0.059  ,-0.081, -0.253,   -0.491  , -0.859  , -1.499 ,  -2.766  , -5.652, -13.307 , -22.167 , -30.267  ,-31.497 ,   0.   ],
       [   0. ,  0.203 ,   0.357  ,  0.416, 0.331,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.     ,  0.    ,   0.     ,  0.   , -14.659 , -30.045 , -50.068  ,-81.776 ,-150.   ],
       [   0. ,  0.116 ,   0.2    ,  0.221, 0.157,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.    ,   0.   ,    0.     ,  0.   , -15.284 , -33.286 , -58.184  ,-95.538 ,-150.   ],
       [   0. ,  0.062 ,   0.104  ,  0.112, 0.075,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.    ,   0.   ,    0.     ,  0.   , -13.192 , -29.633 , -53.842  ,-92.192 ,-150.   ],
       [   0. ,  0.027 ,   0.044  ,  0.047, 0.03 ,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.    ,   0.   ,    0.     ,  0.   ,  -7.851 , -18.211 , -35.36   ,-69.388 ,-150.   ],
       [   0. ,  0.    ,   0.     ,  0.   , 0.   ,  0.   ,    0.     ,  0.     ,  0.    ,   0.    ,   0.    ,  0.  ,   0.  ,     0.    ,   0.    ,   0.   ,    0.     ,  0.   ,   0.    ,   0.    ,   0.     ,  0.    ,-150.   ]]
plt.matshow(mat, aspect='auto', norm=matplotlib.colors.SymLogNorm(0.1))
plt.show()

, который будет производить следующее изображение:

that image


[ 1112] Объяснение :
В matplotlib есть вариант нормализации, в вашем случае, когда вы обрабатываете относительно большое число, и небольшие числа, которые более важны, вам нужно будет войти ( т.е. логарифм) ваши значения, чтобы увидеть различия. Поскольку у вас также есть отрицательные числа, просто записать их в журнал не удастся (log (), очевидно, не обрабатывает отрицательные числа). Таким образом, есть SymLogNorm, которые также обрабатывают отрицательные числа в той же форме. 0.1 является важным параметром, так как значения, близкие к нулю, стремятся к бесконечности, существует потребность в линейном диапазоне около нуля. Параметр linthresh (0.1, как я выбрал здесь, обращаясь к значениям матрицы) позволяет пользователю указать размер этого диапазона (-linthresh, linthresh).

для более подробной информации: Документация SymLogNorm

33
задан tstenner 18 May 2009 в 13:07
поделиться

4 ответа

Я не знаю, считается ли это « чрезмерное копирование », но вы можете использовать строковый поток:

std::ostringstream ss;
ss << someStreamBuf;
std::string s = ss.str();

Например, чтобы прочитать все из stdin в строку , выполните

std::ostringstream ss;
ss << std::cin.rdbuf();
std::string s = ss.str();

В качестве альтернативы вы также можете использовать istreambuf_iterator . Вам нужно будет измерить, будет ли этот способ быстрее - я не знаю.

std::string s((istreambuf_iterator<char>(someStreamBuf)), 
               istreambuf_iterator<char>());

Обратите внимание, что someStreamBuf выше предназначен для представления streambuf * , поэтому возьмите его адрес по мере необходимости. Также обратите внимание на дополнительные круглые скобки вокруг первого аргумента в последнем примере, чтобы он не интерпретировал его как объявление функции, возвращающее строку и принимающее итератор и другой указатель функции («самый неприятный синтаксический анализ»).

46
ответ дан 27 November 2019 в 17:28
поделиться

Я думаю, это больше похоже на:


streambuf.commit( number_of_bytes_read );

istream istr( &streambuf );
string s;
istr >> s;

Я не изучал код basic_streambuf , но считаю, что это должна быть только одна копия в строке.

]
-2
ответ дан 27 November 2019 в 17:28
поделиться

Другая возможность с boost :: asio :: streambuf - использовать boost :: asio :: buffer_cast

24
ответ дан 27 November 2019 в 17:28
поделиться

Причина, по которой вы можете создать const_buffer только из std :: string, заключается в том, что std :: string явно не поддерживает прямую запись на основе указателя в своем контракте. Вы можете сделать что-нибудь плохое, например, изменить размер вашей строки до определенного размера, затем использовать const_cast для константности из c_str () и обращаться с ней как с необработанным буфером char *, но это очень неприятно и однажды вызовет у вас проблемы.

Я использую std :: vector для моих буферов, потому что до тех пор, пока размер вектора не изменяется (или вы внимательно относитесь к изменению размера), вы можете без проблем писать прямой указатель. Если мне нужны некоторые данные в виде std :: string, я должен их скопировать, но, как я работаю с буферами чтения, все, что должно сохраняться за пределами обратного вызова чтения, должно быть скопировано независимо.

0
ответ дан 27 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

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