对于处理存储为.gz文件的图像(我的图像处理软件可以读取.gz文件以获得更短/更小的磁盘时间/空间)我需要检查每个文件的标题.
标题只是每个图像开头的固定大小的小结构,对于未压缩的图像,检查它非常快.为了读取压缩图像,我别无选择,只能解压缩整个文件然后检查这个标题,这当然会减慢我的程序速度.
是否可以读取.gz文件的第一段(比如几个K),解压缩该段并读取原始内容?我对gz的理解是,在开始的一些簿记之后,压缩数据是按顺序存储的 - 这是正确的吗?
所以代替
1.打开大文件F
2.解压缩大文件F
3.读取500字节标题
4.重新压缩大文件F
做
1.开大文件F
2读出的第一5 K.从F作为料流A
3解压缩A作为流B
4从读500字节的头B
我正在使用,libz.so但其他语言的解决方案表示赞赏!
在我的 Ubuntu 20 平台(使用 g++ 9.3.0)上的项目中,我使用以下行
#include <execution>
Run Code Online (Sandbox Code Playgroud)
通过标准库函数支持并行处理。我没有包含来自英特尔并行执行库 TBB 的任何内容。但是当我构建程序时,我收到消息:
#include <execution>
Run Code Online (Sandbox Code Playgroud)
-ltbb通过添加到链接器行,这很容易解决(例如:使消息消失) 。但后来我对 libtbb 产生了依赖,但我并没有指望它。
这种依赖性是预期的吗?是否可以在不安装的情况下使用并行执行tbb(但这tbb会覆盖安装时的默认设置)?
在前一个带有行意味着的列后向量中 - 使用std :: accumulate?我问是否有可能使用STL功能来计算矩阵的行方式
vector< vector<double> > data ( rows, vector<double> ( columns ) );
Run Code Online (Sandbox Code Playgroud)
@benjaminlindley的最佳答案不仅仅是我所寻找的,它还是一件美丽的事情.永远充满希望我认为计算列方法会很容易,所以STL相当于
vector<double> colmeans( data[0].size() );
for ( int i=0; i<data.size(); i++ )
for ( int j=0; j<data[i].size(); j++ )
colmeans[j] += data[i][j]/data.size();
Run Code Online (Sandbox Code Playgroud)
其中均值不是在每个内部计算的vector<double>,而是在所有向量中的相同索引中计算:
colmeans[0] == ( data[0][0] + data[1][0] + ... data[rows][0] ) / rows
colmeans[1] == ( data[0][1] + data[1][1] + ... data[rows][1] ) / rows
colmeans[2] == ( data[0][2] + data[1][2] + ... data[rows][2] ) / rows
... …Run Code Online (Sandbox Code Playgroud) 为了尽可能地懒惰,我在矩阵中读到了
vector< vector<double> > data ( rows, vector<double> ( columns ) );
Run Code Online (Sandbox Code Playgroud)
并尝试尽可能多地使用STL好吃的东西.
我接下来要做的一件事就是计算行的意思.在C风格的编程中
vector<double> rowmeans( data.size() );
for ( int i=0; i<data.size(); i++ )
for ( int j=0; j<data[i].size(); j++ )
rowmeans[i] += data[i][j]/data[i].size();
Run Code Online (Sandbox Code Playgroud)
在In C++中,如何使用向量视图和gsl_stats_mean计算整数向量的均值?它解释了对于数字向量,您可以在一行中计算向量均值,而无需在每一步调用size()运算符:
double mean = std::accumulate(stl_v.begin(), stl_v.end(), 0.0) / stl_v.size();
Run Code Online (Sandbox Code Playgroud)
是否可以在向量向量上使用这些迭代器?中间形式是
vector<double> rowmeans( rows );
for ( int i=0; i<data.size(); i++ )
rowmeans[i] = std::accumulate(data[i].begin(), data[i].end(), 0.0) / data[i].size();
Run Code Online (Sandbox Code Playgroud)
已经1线走了!但是使用STL函数也可以摆脱[i]索引吗?(在顶层,这只是收集行的意思).
我有
vector < vector < int > > data_mat ( 3, vector < int > (4) );
vector < int > data_vec ( 3 );
Run Code Online (Sandbox Code Playgroud)
其中,data_mat可以被看作是一个矩阵,data_vec为列向量,和我正在寻找一种方法来计算每列的内积data_mat有data_vec,并将其存储在另一个vector < int > data_out (4)。
使用和的示例http://liveworkspace.org/code/2bW3X5%241可用于计算矩阵的列总和:for_eachtransform
sum=vector<int> (data_mat[0].size());
for_each(data_mat.begin(), data_mat.end(),
[&](const std::vector<int>& c) {
std::transform(c.begin(), c.end(), sum.begin(), sum.begin(),
[](int d1, double d2)
{ return d1 + d2; }
);
}
);
Run Code Online (Sandbox Code Playgroud)
是否可以通过类似的方式(或使用STL函数的方式略有不同)来计算矩阵列与矢量的列点积?
问题在于,“ d2 = d1 + d2”技巧在此列内积案例中不起作用-如果有一种方法也可以包含d3来解决它(d3 = d3 …
我在向量<vector <double >>中有数值数据,需要为它们添加标量值,如下所示:
vector <vector<double> > data ( M, vector<double>(N) );
vector <double>scalars(N);
data[0][0] += scalars[0];
data[0][1] += scalars[1];
...
data[0][N-1] += scalars[N-1];
data[1][0] += scalars[0];
data[1][1] += scalars[1];
...
data[1][N-1] += scalars[N-1];
...
data[M-1][N-1] += scalars[N-1];
Run Code Online (Sandbox Code Playgroud)
当然,这可以通过两个for循环来实现.我想知道它是否可以简单地使用transform,bind和plus来完成?我试图尽可能使用仿函数(尽管仍然习惯使用旧的C风格代码).
内部循环需要对数据中的向量0执行此操作:
transform ( data[0].begin(), data[0].end(),
scalars[0].begin(),
data[0].begin(),
plus<double>() )
Run Code Online (Sandbox Code Playgroud)
是否有可能将此行中的数据[0]替换为另一个计数器(与数据[0] ...数据[N-1]的变换相关)?这可能是一个标准问题,但我找不到一个好的参考.
当我在c ++中使用重载[] []运算符来创建一个最小矩阵类
class matrix {
private:
vector<T> elems_;
size_t nrows_;
size_t ncols_;
public:
T const* operator[] ( size_t const r ) const { return &elems_[r * ncols_]; }
T* operator[] ( size_t const r ) { return &elems_[r * ncols_]; }
matrix ();
matrix ( size_t const nr, size_t const nc )
: elems_( nr * nc ), nrows_( nr ), ncols_( nc )
{ }
matrix ( size_t const nr, size_t const nc, T …Run Code Online (Sandbox Code Playgroud)