警告
以下答案是不正确的。请查看底部的编辑。我保留原始答案以便了解错误的背景和贡献者。
我不是特别熟悉boost库,因此可能有更标准的方法来完成此操作,但我认为您可以使用迭代器和STL
transform函数模板来实现所需功能。
uBLAS库文档介绍中说其类被设计为与在STL中使用的相同迭代器行为兼容。boost矩阵和向量模板都
具有迭代器,可用于访问单个元素。向量具有
begin()
和
end()
,矩阵具有
begin1()
、
end1()
、
begin2()
和
end2()
。
1
种是列迭代器,
2
种是行迭代器。有关更多信息,请参见boost
VectorExpression和
MatrixExpression文档。
使用STL transform
算法,您可以将函数应用于可迭代序列的每个元素,并将结果分配给相同长度的不同可迭代序列或相同序列。因此,要在boost uBLAS向量上使用它,您可以这样做:
using namespace boost::numeric::ublas;
vector<double> vec(30);
std::fill(vec.begin(), vec.end(), 8.0);
std::transform(vec.begin(), vec.end(), vec.begin(), boost::math::tgamma);
对于矩阵而言,基本上是一样的,你需要使用
1
或
2
系列的迭代器。你选择使用哪个取决于你的矩阵的内存布局是行优先还是列优先。对uBLAS文档的初步扫描让我相信它可能是任意一个,因此你需要检查代码并确定正在使用哪个,以便选择最有效的迭代顺序。
matrix<double> mat(30, 30)
.
.
.
std::transform(mat.begin1(), mat.end1(), mat.begin1(), boost::math::tgamma)
你传递的最后一个参数可以是一个接受单个双精度参数并返回双精度值的函数。它也可以是一个
函数对象。
这不完全与你引用的向量化示例相同,但它似乎非常接近你想要的。
编辑
看起来在推荐之前我应该先测试一下。正如其他人所指出的那样,“1”和“2”迭代器只沿着矩阵的单行/单列进行迭代。Boost中的概述文档严重误导了用户。它声称begin1()
“返回指向矩阵开头的iterator1”,而end1()
“返回指向矩阵结尾的iterator1”。他们为什么不能说“矩阵的一列”而不是“矩阵”呢?我假设iterator1
是一个按列迭代整个矩阵的迭代器。正确的方法,请参见Lantern Rouge的答案。
begin1
和end1
只遍历第一列,而不是整个矩阵。begin2
和end2
对于第一行也是如此。请参考Lantern Rouge的答案,了解可能的解决方案。 - betabandido