我想知道以下matlab习惯用法最有效的c ++实现是什么。
假设我在matlab,x,y和idx中有3个向量。
x = [13,2,5.5,22,107]
y = [-3,100,200]
idx = [1,2,5]
我想用x的内容替换x的位置1,2和5。在matlab我做
x[idx] = y
在c ++中执行此操作的最佳方法是什么?
答案 0 :(得分:13)
Armadillo库可能最接近,因为它的目标之一是让习惯于Matlab的人们轻松一点。
这是一个简短的例子(uvec
是无符号整数向量的typdef)
// set four specific elements of X to 1
uvec indices;
indices << 2 << 3 << 6 << 8;
X.elem(indices) = ones<vec>(4);
显然,右侧可以是与索引具有相同维度的任何其他向量。
但是你无法克服语言强加的限制:
[
答案 1 :(得分:3)
循环似乎很简单,尽管使用辅助函数可以使循环变得更简单。
// helper function to get the size of an array
template<typename T, size_t S>
constexpr size_t size(T (&)[S])
{
return S;
}
// loop
for (size_t i = 0; i < size(idx); ++i) x[idx[i]] = y[i];
当然,在这里你应该检查y
是否足够大:
答案 2 :(得分:2)
如果你想要它非常基本的C ++(没有优雅的奖品)试试这个:
double x[] = { 13.0, 2.0, 5.5, 22.0, 107.0 };
double y[] = { -3.0, 100.0, 200.0 };
size_t idx[] = { 1, 2, 5 };
for ( size_t i = 0; i < sizeof(x)/sizeof(double); ++i )
cout << x[i] << " ";
cout << endl;
// Make a mutable copy of x
double x1[ sizeof(x)/sizeof(double) ];
std::copy( x, x + sizeof(x)/sizeof(double), x1 );
// The transformation
for ( size_t i = 0; i < sizeof(idx)/sizeof(double); ++i )
x1[idx[i]] = y[i];
for ( size_t i = 0; i < sizeof(x)/sizeof(double); ++i )
cout << x1[i] << " ";
cout << endl;
请注意相当漂亮,但确实提供了以下内容:
13 2 5.5 22 107
-3 100 5.5 22 200
(请注意,我假设索引从idx
开始,而不是0)