MATLAB中的元素矩阵复制

San*_*lai 7 replication matlab matrix elements

我有一个3维矩阵.我想将大小为8x2x9的矩阵复制到由向量给出的第三维中指定的次数,[3, 2, 1, 1, 5, 4, 2, 2, 1]这样得到的矩阵大小为8x2x21.repelem对于矩阵,是否有任何内置MATLAB函数(我正在运行版本2014a)来执行类似于较新函数的操作?

我需要的一个简单例子:

% Input:
A(:,:,1) = [1 2; 1 2];
A(:,:,2) = [2 3; 2 3];

% Function call:
A = callingfunction(A, 1, 1, [1 2]);

% Output:
A(:,:,1) = [1 2; 1 2];
A(:,:,2) = [2 3; 2 3];
A(:,:,3) = [2 3; 2 3];
Run Code Online (Sandbox Code Playgroud)

gno*_*ice 6

对于R2015a和更新......

根据repelem(在R2015a版本中首次引入)的文档,它也可以在矩阵上运行.我相信下面的代码应该完成你想要的(我无法测试它,因为我有一个旧版本):

newMat = repelem(mat, 1, 1, [3 2 1 1 5 4 2 2 1]);
Run Code Online (Sandbox Code Playgroud)

对于R2015a之前的版本......

您可以使用此问题中的一种方法将索引复制到第三维,然后使用该索引简单地索引矩阵.例如(适应Divakar的解决方案):

vals = 1:size(mat, 3);
clens = cumsum([3 2 1 1 5 4 2 2 1]);
index = zeros(1, clens(end));
index([1 clens(1:end-1)+1]) = diff([0 vals]);
newMat = mat(:, :, cumsum(index));
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其概括为一个函数,以便在多个维度上运行,如repelem:

function A = my_repelem(A, varargin)

  index = cell(1, nargin-1);
  for iDim = 1:nargin-1
    lens = varargin{iDim};
    if isscalar(lens)
      if (lens == 1)
        index{iDim} = ':';
        continue
      else
        lens = repmat(lens, 1, size(A, iDim));
      end
    end
    vals = 1:size(A, iDim);
    clens = cumsum(lens);
    index{iDim} = zeros(1, clens(end));
    index{iDim}([1 clens(1:end-1)+1]) = diff([0 vals]);
    index{iDim} = cumsum(index{iDim});
  end
  A = A(index{:});

end
Run Code Online (Sandbox Code Playgroud)

对于您的示例数据,您可以像这样使用它:

>> A(:,:,1) = [1 2; 1 2];
>> A(:,:,2) = [2 3; 2 3];
>> A = my_repelem(A, 1, 1, [1 2])

A(:,:,1) =

     1     2
     1     2

A(:,:,2) =

     2     3
     2     3

A(:,:,3) =

     2     3
     2     3
Run Code Online (Sandbox Code Playgroud)