matlab风格的C++数组索引
matlab style indexing of a C++ array
我想知道以下matlab习惯用法的最有效的c++实现是什么。
假设我在matlab中有3个向量,x,y和idx。
x = [13,2,5.5,22,107]
y = [-3,100,200]
idx = [1,2,5]
我想用y的内容替换x的位置1,2和5。在matlab中,我做
x[idx] = y
在c++中,最好的方法是什么?
Armadillo库可能是最接近的,因为它的目标之一是让使用Matlab的人更容易上手。
这里有一个简短的例子(uvec
是无符号整数向量的典型定义)
// set four specific elements of X to 1
uvec indices;
indices << 2 << 3 << 6 << 8;
X.elem(indices) = ones<vec>(4);
显然,右侧可以是与索引具有相同维度的任何其他向量。
但很少有语言强加的限制是你无法克服的:
- C++级别的零基索引(您可以更改,但很少有C/C++程序员会认为这是个好主意)
- 某些操作员,包括
[
循环似乎足够简单,尽管使用辅助函数可以使其更简单。
// 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
是否足够大:
如果你想在非常基本的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
中的索引从1开始,而不是从0开始)
相关文章:
- 数组索引的值没有增加
- 并行用于C++17中数组索引范围内的循环
- 数组索引重载错误
- 通过指针与数组引用扩展数组索引序列
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 缓冲区溢出 - 数组索引越界(严重)
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)
- 查找下一个具有真值C++的数组索引
- 在编译时自动生成用于稀疏数组索引的switch语句
- 在数组索引上引发异常
- C++ 将二维数组索引与条件语句中的函数值进行比较
- 平衡数组索引,同时从左和右对数组求和
- 为什么C ,Devstudio,数组索引工作
- 如何对同一数组索引下的结构成员进行排序?
- 我想返回数组索引,而不是数组值
- C++相当于 Python 的:用于数组索引
- 分段错误:为什么这里的数组索引越界了
- 数组索引在地图上不是整数
- 根据用户输入的每个字母添加到数组索引
- C 数组索引