Matlab: уникальное поколение матриц из конкатенации? - PullRequest
1 голос
/ 02 апреля 2020

Допустим, у меня есть простой 2D-массив A:

A = [0.25 0.3; 0.1 0.5];

, и я хочу объединить третью строку с каждой поэлементной комбинацией следующих векторов:

B = 0:0.1:1;
C = 0:0.1:1;

для создания 121 уникальной матрицы. Например:

A_prime = [0.25 0.3; 0.1 0.5; 0 0];

будет одной из таких матриц.

Я бы хотел, по возможности, избежать использования явных циклов for и использовать для этого либо arrayfun, либо cellfun.

Я знаю, что meshgrid предоставит все уникальные комбинации B и C, и я мог бы определить функцию для выполнения конкатенации A и элемента B, C соответственно. То есть:

[b_mesh, c_mesh] = meshgrid(B,C);
myfun = @(A,b,c) [A; b,c];

, но arrayfun приведет к ошибке:

arrayfun(myfun, A, b_mesh, c_mesh)

Error using arrayfun
All of the input arguments must be of the same size and shape.
Previous inputs had size 2 in dimension 1. Input #3 has size 11

, что имеет смысл. Итак, существует ли подобная реализация для генерации всех уникальных матриц, которая сохраняет согласованность размеров?

Другая идея, которая у меня была, заключается в том, чтобы потенциально генерировать матрицу большего размера, где каждая подматрица 3x3 - это 1 из уникальных матриц, которые я ищу для, а затем извлечь каждый при необходимости.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

Вот альтернативный вариант использования repmat и permute, который создает трехмерную матрицу, так что каждая 2d плоскость представляет собой одну комбинацию:

A = [0.25 0.3; 0.1 0.5];
[b_mesh, c_mesh] = meshgrid(B,C);
A_prime = [repmat(A, 1, 1, numel(b_mesh)); permute([b_mesh(:), c_mesh(:)], [3 2 1])];

Результат:

A_prime =

ans(:,:,1) =

   0.25000   0.30000
   0.10000   0.50000
   0.00000   0.00000

ans(:,:,2) =

   0.25000   0.30000
   0.10000   0.50000
   0.00000   0.10000

ans(:,:,3) =

   0.25000   0.30000
   0.10000   0.50000
   0.00000   0.20000

ans(:,:,4) =

   0.25000   0.30000
   0.10000   0.50000
   0.00000   0.30000

...

Отдельные комбинации можно получить с помощью 3-го индекса:

A_prime(:,:,112)
ans =

   0.25000   0.30000
   0.10000   0.50000
   1.00000   0.10000
1 голос
/ 02 апреля 2020

Может быть, вы можете попробовать meshgrid + cellfun, как показано ниже

[b,c] = meshgrid(B,C);
Z = [b(:),c(:)];
A_primes = cellfun(@(x) [A;x], mat2cell(Z,ones(1,size(Z,1)),size(Z,2)),'UniformOutput', false);

, например,

>> A_primes
A_primes =
{
  [1,1] =

     0.25000   0.30000
     0.10000   0.50000
     0.00000   0.00000

  [2,1] =

     0.25000   0.30000
     0.10000   0.50000
     0.00000   0.10000

  [3,1] =

     0.25000   0.30000
     0.10000   0.50000
     0.00000   0.20000

  [4,1] =

     0.25000   0.30000
     0.10000   0.50000
     0.00000   0.30000

  [5,1] =

     0.25000   0.30000
     0.10000   0.50000
     0.00000   0.40000

  [6,1] =

     0.25000   0.30000
     0.10000   0.50000
     0.00000   0.50000

....
...