gpt4 book ai didi

c++ - Armadillo 相当于 Matlab 置换?

转载 作者:行者123 更新时间:2023-11-30 00:47:07 28 4
gpt4 key购买 nike

我有一个 arma::cube mycube(5,10,15); 我想排列它的尺寸,就像在 matlab 中做的那样:

mycube = ones(5,10,15);
mycube = permute(mycube,[3 1 2]);
size(mycube) % returns (15 5 10)

有办法吗?
会不会太低效了?

我实际上想做一个 3D FFT,所以我想到排列第一和第三维以便能够使用 arma::fft,然后再排列回去。

最佳答案

制作 3 维数组 (arma::cube) 排列的另一种简单方法是下面的方法。这不是很优雅,但很容易理解。

因为3个唯一数的排列是6(准确地说是5,没有引用顺序),所以很快就避免了算法方法。

dim 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 开始),而 Armadillo 是从零开始的数组。

shape(cube) 函数只是一个小 helper ,它返回 matlab 中 Size() 的等价物,一个具有每个维度大小的 N-dim 数组。

template <typename T> 
inline u32_vec shape (const Cube<T>& x)
{
return { x.n_rows, x.n_cols, x.n_slices };
}

代码需要配合使用:

using namespace arma;

关于c++ - Armadillo 相当于 Matlab 置换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796248/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com