另一個簡單的方法來製作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