如何在矩阵中添加尾随单例维度

And*_*uri 9 matlab mex

正如标题所说,如何在Matlab中向矩阵添加尾随单例维度?

A=ones(3,3,1);给出3x3矩阵,同时A=ones(1,3,3);给出1x3x3矩阵

添加到具体问题:

我有一个应用程序,我有N MxM矩阵,我需要堆叠它们,结果成为一个MxMxN矩阵.但是,N可以是1,如果是,我需要矩阵为MxMx1.

注意:我知道这对Matlab脚本没有多大意义,正如Loren所说,在Matlab中,在非单例之后存在无限的"单例"维度.但是,这是在mex环境中mxGetNumberOfDimensions使用的地方.

cha*_*pjc 8

即使从MEX API的角度来看,MATLAB也会删除尾随单例.在对文档mxSetDimensions发言权了:

MATLAB®自动删除dims参数中指定的任何尾随单例维度.例如,如果ndim等于5且dims等于[4 1 7 1 1],则生成的数组的尺寸为4×1×7.

再次,那是来自mxSetDimensions文档.

以下是使用mxSetDimensions或尝试此操作的测试mxCreateNumericArray:

// mexSizeTest.cpp
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
    if (nrhs!=1)
        mexErrMsgTxt("Just one input please.");

    mxArray *M = mxDuplicateArray(prhs[0]);
    const mwSize ndimsOrig = mxGetNumberOfDimensions(M);
    const mwSize *dimsOrig = mxGetDimensions(M);

    mexPrintf("Number of dimensions (input): %d\n\n", ndimsOrig);

    const mwSize ndims = ndimsOrig + 1;
    mwSize *dims = (mwSize*) mxMalloc(ndims*sizeof(mwSize));
    for (int i=0; i<ndimsOrig; ++i) dims[i] = dimsOrig[i];
    dims[ndims-1] = 1;

    mexPrintf("Target dimensions: [");
    for (int i=0; i<ndims-1; ++i) mexPrintf("%d ",dims[i]);
    mexPrintf("%d]\n\n",dims[ndims-1]);

    mexPrintf("Reshaping to #dims = %d with trailing singleton.\n", ndims);
    mxSetDimensions(M, dims, ndims);
    mexPrintf("Number of Dimensions: %d\n\n", mxGetNumberOfDimensions(M));

    // Let's be dangerous to see if the 1 is just hiding under the hood
    const mwSize *dimsSet = mxGetDimensions(M);
    mexPrintf("Being dangerous: %d\n\n", dimsSet[ndims-1]); // !!!
    mxDestroyArray(M);

    mexPrintf("Creating fresh mxArray of #dims = %d with trailing singleton.\n",
            ndims);
    M = mxCreateNumericArray(ndims, dims, mxDOUBLE_CLASS, mxREAL);
    mexPrintf("Number of Dimensions: %d\n",mxGetNumberOfDimensions(M));
    mxDestroyArray(M); mxFree(dims);
}
Run Code Online (Sandbox Code Playgroud)

MATLAB测试:

>> M = rand(24,55,1);
>> size(M)
ans =
    24    55
>> ndims(M)
ans =
     2
>> size(M,454235) % note we can check the 454235th dimension
ans =
     1
Run Code Online (Sandbox Code Playgroud)

附带size(M,454235)测试的旁注:这就是ndim文档说的时候的意思Trailing singleton dimensions are ignored.他们真的没有被忽视,他们只是不是真的在那里!

MEX测试(mexSizeTest.cpp):

>> mexSizeTest(M)
Number of dimensions (input): 2

Target dimensions: [24 55 1]

Reshaping to #dims = 3 with trailing singleton.
Number of Dimensions: 2

Being dangerous: -994713024

Creating fresh mxArray of #dims = 3 with trailing singleton.
Number of Dimensions: 2
Run Code Online (Sandbox Code Playgroud)

我建议调整你的代码来处理mxGetNumberOfDimensions返回2 的情况.


jig*_*jer 5

您可以使用permute将尾随默认单例维度注入到非尾随位置。例如:

A = rand(50,50); % produces a 50 x 50 matrix
B = permute(A, [1 3 2]); % produces a 50 x 1 x 50 array
Run Code Online (Sandbox Code Playgroud)

这里,3 指的是数组中的第三个维度,即大小为 1 的隐式维度。

  • 谢谢吉古杰尔。我也通过谷歌来到这里,你的答案就是我需要的。 (3认同)