矢量化阵列中的列的重塑

时间:2012-11-27 02:44:49

标签: arrays matlab octave vectorization

我有一个数组A,并希望将每列的最后四个元素重新整形为2x2矩阵。我希望将结果存储在单元格数组B中。

例如,给定:

A = [1:6; 3:8; 5:10]';

我希望B包含三个2x2数组,例如:

B{1} = [3, 5; 4, 6];
B{2} = [5, 7; 6, 8];
B{3} = [7, 9; 8, 10];

我显然可以在for循环中使用reshape(A(end-3:end, ii), 2, 2)和循环ii之类的东西。任何人都可以提出一个矢量化方法,可能使用类似于cellfun的东西,它可以重复地对一个数组的列应用一个操作吗?

1 个答案:

答案 0 :(得分:2)

我这样做的方法是查看所需的索引,然后找出生成它们的方法,通常使用某种形式的repmat。例如,如果你想要每列中的最后4个项目,那么A中的(绝对)索引将是3,4,5,6,然后将行数添加到下一列以获得9 ,10,11,12等。因此,问题就是根据行数,列数以及每列所需的元素数生成矩阵(我将其称为n,在您的情况下为n = 4)。

octave:1>  A = [1:6; 3:8; 5:10]'
A =

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

octave:2>  dim=size(A)
dim =

   6   3

octave:3> n=4
n =  4
octave:4> x=repmat((dim(1)-n+1):dim(1),[dim(2),1])'
x =

   3   3   3
   4   4   4
   5   5   5
   6   6   6

octave:5> y=repmat((0:(dim(2)-1)),[n,1])
y =

   0   1   2
   0   1   2
   0   1   2
   0   1   2

octave:6> ii=x+dim(1)*y
ii =

    3    9   15
    4   10   16
    5   11   17
    6   12   18

octave:7> A(ii)
ans =

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

octave:8> B=reshape(A(ii),sqrt(n),sqrt(n),dim(2))
B =

ans(:,:,1) =

   3   5
   4   6

ans(:,:,2) =

   5   7
   6   8

ans(:,:,3) =

    7    9
    8   10

根据你生成x和y的方式,你甚至可以取消乘法,但我会把它留给你。 :d

IMO你不需要一个单元格阵列来存储它们,一个3D矩阵也能正常工作,你以同样的方式索引它(但在你使用它之前不要忘记它squeeze

我在this question.

中给出了类似的答案