填充提升向量或矩阵

Posted

技术标签:

【中文标题】填充提升向量或矩阵【英文标题】:filling a boost vector or matrix 【发布时间】:2009-04-28 13:42:56 【问题描述】:

是否有一种单一表达式的方式来为提升矩阵或向量的所有元素分配一个标量?我正在尝试找到一种更紧凑的表示方式:

boost::numeric::ublas::c_vector<float, N> v;
for (size_t i=0; i<N; i++) 
    v[i] = myScalar;
 

以下方法不起作用:

boost::numeric::ublas::c_vector<float, N> 
   v(myScalar, myScalar, ...and so on..., myScalar);

boost::numeric::ublas::c_vector<float, N> v;
v = myScalar;

【问题讨论】:

你也应该标记这个“C++”。 【参考方案1】:

因为向量模型是标准随机访问容器,您应该能够使用标准 STL 算法。比如:

c_vector<float,N> vec;
std::fill_n(vec.begin(),N,0.0f);

std::fill(vec.begin(),vec.end(),0.0f);

它可能也与 Boost.Assign 兼容,但您必须检查一下。

【讨论】:

STL 算法似乎确实有效。谢谢。 Boost.Assign 似乎对我不起作用,但我认为这是因为我使用的是 c_vector(常量大小的向量)而不是向量(动态大小的向量),所以 push_back 不起作用。 这不能回答你将如何填写boost::numeric::ublas::matrix【参考方案2】:

我已经开始使用boost::assign 来处理我想静态分配特定值的情况(从上面的链接中提取的示例)。

#include <boost/assign/std/vector.hpp>
using namespace boost::assign; // bring 'operator+()' into scope


  vector<int> values;
  values += 1,2,3,4,5,6,7,8,9;

您也可以将boost::assign 用于地图。

#include <boost/assign/list_inserter.hpp>
#include <string>
using boost::assign;

std::map<std::string, int> months;
insert( months )
        ( "january",   31 )( "february", 28 )
        ( "march",     31 )( "april",    30 )
        ( "may",       31 )( "june",     30 )
        ( "july",      31 )( "august",   31 )
        ( "september", 30 )( "october",  31 )
        ( "november",  30 )( "december", 31 );

您可以允许使用list_of()map_list_of() 进行直接分配

#include <boost/assign/list_of.hpp> // for 'list_of()'
#include <list>
#include <stack>
#include <string>
#include <map>
using namespace std;
using namespace boost::assign; // bring 'list_of()' into scope


    const list<int> primes = list_of(2)(3)(5)(7)(11);
    const stack<string> names = list_of( "Mr. Foo" )( "Mr. Bar")
                                       ( "Mrs. FooBar" ).to_adapter();

    map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

    // or we can use 'list_of()' by specifying what type
    // the list consists of
    next = list_of< pair<int,int> >(6,7)(7,8)(8,9);


还有repeat()repeat_fun()range() 的函数,允许您添加重复值或值范围。

【讨论】:

第一个例子似乎是针对 std::vector (它适用),而不是 boost::numeric::ublas::vector (它不适用)。【参考方案3】:

推荐的方式如下:

boost::numeric::ublas::c_vector<float, N> v;
v = boost::numeric::ublas::zero_vector<float>(N);
v = boost::numeric::ublas::scalar_vector<float>(N, value);

矩阵类型也是如此:

boost::numeric::ublas::matrix<float> m(4,4);
m = boost::numeric::ublas::identity_matrix<float>(4,4);
m = boost::numeric::ublas::scalar_matrix<float>(4,4);
m = boost::numeric::ublas::zero_matrix<float>(4,4);

【讨论】:

不知道值类型怎么弄出来?【参考方案4】:

你试过了吗?

ublas::c_vector v = ublas::scalar_vector(N, myScalar);

【讨论】:

【参考方案5】:

自从我使用 C++ 以来已经有一段时间了。以下是否有效?

for (size_t i = 0; i < N; v[i++] = myScalar) ;

【讨论】:

这行得通,虽然它是一个完整的语句而不是一个表达式。 没错,但它是更紧凑的方式,这是您希望根据帖子找到的方式。 -1 抱歉。您必须使用“v[i++]”——“v[++i]”将跳过 v[0] 的初始化并覆盖向量末尾之后的内存。 确认。对不起!我确实承认我必须使用正确的一元运算符,但由于某种原因,我一直认为 ++i 是在评估后增加 i 的那个。主要是因为每个人都喜欢 i++,而“i += 1”的行为似乎更合乎逻辑。无论如何现在都已修复.. 我想我也应该感谢你,我喜欢 600 代表而不是 601!

以上是关于填充提升向量或矩阵的主要内容,如果未能解决你的问题,请参考以下文章

根据部分填充的向量形成“部分”单位矩阵

低秩矩阵填充|奇异值阈值算法

R语言矩阵向量操作(矩阵乘法,向量内积外积(叉乘),矩阵转置,矩阵的逆)

R语言矩阵向量操作(矩阵乘法,向量内积外积(叉乘),矩阵转置,矩阵的逆)

如何将矩阵转换为R中的列向量列表?

矩阵乘法:向量到矩阵的转换