从矩阵构造有序对的单元数组

时间:2013-07-10 15:30:40

标签: matlab multidimensional-array cell

我想从以下两个矩阵中创建有序对的单元格数组......

[X,Y] = meshgrid(1:10,1:10)

X =

 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10

Y =

 1     1     1     1     1     1     1     1     1     1
 2     2     2     2     2     2     2     2     2     2
 3     3     3     3     3     3     3     3     3     3
 4     4     4     4     4     4     4     4     4     4
 5     5     5     5     5     5     5     5     5     5
 6     6     6     6     6     6     6     6     6     6
 7     7     7     7     7     7     7     7     7     7
 8     8     8     8     8     8     8     8     8     8
 9     9     9     9     9     9     9     9     9     9
10    10    10    10    10    10    10    10    10    10

...其中(我假设为1x2x10x10)单元阵列Z是一个单元格数组,其中X和Y中的所有条目都是x和y坐标,每个单独的坐标对是Z的元素:

Z = { (1,1)  (2,1)  (3,1)  ... (10,1);
  (1,2)  (2,2)  (3,2)  ... (10,2);
  ...     ...    ...   ...  ...;
  (1,10) (2,10) (3,10) ... (10,10) }

我将如何做到这一点?

3 个答案:

答案 0 :(得分:1)

Z = squeeze(num2cell(permute(cat(3,X,Y),[3,1,2]),1));

步骤:

  1. 沿第三维连接X和Y:

    Z = cat(3,X,Y)
    
  2. 置换生成的数组,使其具有沿第一维的坐标对:

    Z = permute(Z,[3,1,2])
    
  3. 转换为单元格数组:

    Z = num2cell(Z)
    
  4. 从单元格数组中删除不必要的单例维度:

    Z = squeeze(Z)
    
  5. 结果单元格数组在表格

    上包含2x1列向量的坐标对
    [x-coordinate; y-coordinate]
    

答案 1 :(得分:1)

会出现什么问题
Z = cat(3, X,Y)

这样

>> Z(1, 2, :)
ans(:,:,1) =
     2
ans(:,:,2) =
     1

如果您不喜欢1 x 1乘2格式,则可以执行此操作

Z = cellfun(@squeeze, num2cell(cat(3,X,Y),3), 'UniformOutput', false)

或者这个

Z = reshape(num2cell([X(:) Y(:)], 2), size(X))

答案 2 :(得分:0)

我可能会使用自己的东西是不同的,例如:

[X(:) Y(:)]

但是,我试图以最简单的方式为您提供所需的输出:

Z=num2cell(cat(3,X,Y),3)