如何在C中对n维矩阵上的维数重新排序?(类似于Matlab中的permute(A[2:n1]))

如何在C中对n维矩阵上的维数重新排序?(类似于Matlab中的permute(A[2:n1])),c,arrays,matlab,matrix,multidimensional-array,C,Arrays,Matlab,Matrix,Multidimensional Array,我正在处理一个n维矩阵(它被存储为一个一维数组),我希望在它的维度中重新排序,以便前导维度现在是最后一个维度 如果尺寸(A)=3x4x5x6,我想把它改成4x5x6x3。 这类似于二维矩阵的转置函数 它可以用Matlab中的置换函数来实现 对于n维矩阵A,我需要以下转换 A=permute(A,[2:n 1]) 我怎么能用C来做呢 另外,我不是想重塑矩阵,而是实际移动元素,以获得下一个维度作为主导维度 排列可以定义为 B = PERMUTE(A,ORDER) rearranges the di

我正在处理一个n维矩阵(它被存储为一个一维数组),我希望在它的维度中重新排序,以便前导维度现在是最后一个维度

如果尺寸(A)=3x4x5x6,我想把它改成4x5x6x3。 这类似于二维矩阵的转置函数

它可以用Matlab中的置换函数来实现 对于n维矩阵A,我需要以下转换

A=permute(A,[2:n 1])
我怎么能用C来做呢

另外,我不是想重塑矩阵,而是实际移动元素,以获得下一个维度作为主导维度

排列可以定义为

B = PERMUTE(A,ORDER) rearranges the dimensions of A so that they
%   are in the order specified by the vector ORDER.  The array produced
%   has the same values as A but the order of the subscripts needed to 
%   access any particular element are rearranged as specified by ORDER.
%   For an N-D array A, numel(ORDER)>=ndims(A). All the elements of 
%   ORDER must be unique.

我不想尝试在适当的位置执行此操作,但复制到新阵列将比您已经在执行的操作稍微复杂一些。我为我的apl解释器编写了一个类似的函数

如果您的操作可以将索引列表和维度列表转换为单个1D索引,反之,可以将单个索引和维度列表转换为索引列表;然后迭代1D数组,使用源维度生成索引列表,对索引列表应用排列,使用目标维度转换回单个索引,并将结果存储在目标数组中

dest dimensions = permute source dimensions
for each element in source
    generate source indices from source index and source dimensions
    dest indices = permute source indices 
    generate dest index from dest indices and dest dimensions
    dest[dest index] = source[source index]

伪代码描述了该算法,但这里有一个实现:。该函数更改其参数,因此对于上述语义,它应该首先调用
clone()
,然后调用
copy()
,以实际移动数据并保持原始数据不受干扰

您需要
realloc
或使用静态大小,每个维度的大小与最坏情况下的大小一样大。@FiddlingBits您能详细说明一下吗?该问题类似于旋转长方体(对于3D矩阵)以使左侧面位于前面。如果将每个维度
malloc
调整为特定长度,则可以使用
realloc
调整其长度。如果使用静态大小的编译数组,则需要使每个维度的长度尽可能大。如果您有一个
3 x 4 x 5 x 6
并希望将其更改为
4 x 5 x 6 x 7
,则其他元素应来自何处?这不是
A=permute(A[2:n1])
所做的@Daniel抱歉,那是3 x 4 x 5 x 6到4 x 5 x 6 x 3您能给出一个示例或示例代码来更清楚些吗?用源代码链接编辑。