另一个简单的方法来制作3-dim数组(arma :: cube)排列是下面的一个。这不是很优雅,但容易理解。
由于3个独特的数字的置换是6(是没有基准级准确5),它的快速,以避免计算方法。
暗淡1,2,3的置换:
123(基序)132 213 231 312 321
所以型动物置换之间一个简单的开关:
template <typename T>
static Cube<T> permute (Cube<T>& cube, const std::tuple<uword,uword,uword>& order)
{
uword idx1 = std::get<0>(order);
uword idx2 = std::get<1>(order);
uword idx3 = std::get<2>(order);
u32_vec dimension = shape(cube);
uword rows = dimension(idx1 - 1);
uword cols = dimension(idx2 - 1);
uword slis = dimension(idx3 - 1);
Cube<T> output;
output.zeros(rows, cols, slis);
uword perm = idx1*100 + idx2*10 + idx3;
switch (perm)
{
case 123:
{
output = cube; // identity
}
break;
case 132:
{
for (int c = 0; c < cube.n_cols; ++c)
for (int r = 0; r < cube.n_rows; ++r)
for (int s = 0; s < cube.n_slices; ++s)
output(r, s, c) = cube(r, c, s);
}
break;
case 213:
{
for (int c = 0; c < cube.n_cols; ++c)
for (int r = 0; r < cube.n_rows; ++r)
for (int s = 0; s < cube.n_slices; ++s)
output(c, r, s) = cube(r, c, s);
}
break;
case 231:
{
for (int c = 0; c < cube.n_cols; ++c)
for (int r = 0; r < cube.n_rows; ++r)
for (int s = 0; s < cube.n_slices; ++s)
output(c, s, r) = cube(r, c, s);
}
break;
case 312:
{
for (int c = 0; c < cube.n_cols; ++c)
for (int r = 0; r < cube.n_rows; ++r)
for (int s = 0; s < cube.n_slices; ++s)
output(s, r, c) = cube(r, c, s);
}
break;
case 321:
{
for (int c = 0; c < cube.n_cols; ++c)
for (int r = 0; r < cube.n_rows; ++r)
for (int s = 0; s < cube.n_slices; ++s)
output(s, c, r) = cube(r, c, s);
}
break;
}
return output;
}
顺序元组是基于MATLAB的(基于1的),而犰狳是基于零的数组。
形状(立方体)函数仅仅是一个小帮手,在MATLAB返回尺寸相当于(),一个n维数组与每个维度大小。
using namespace arma;
你会想到simplePermute对工作'ARMA :: cx_cube'太:
的代码需要与使用? – dangom
@DanielG,是的,这里主要的是维数。 –
实际上,排列函数不能正常工作。它不会产生与matlab相同的结果。举一个简单的例子,如果矩阵是一个完美的立方体,'simplePermute'不会对它做任何事情。 – dangom