Arrays 数组中列的矢量化重塑

Arrays 数组中列的矢量化重塑,arrays,matlab,octave,vectorization,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循环中使用类似于重塑(a(end-3:end,ii),2,2)和循环ii的东西来实现这一点。有人能提出一种矢量化方法吗?也许可以使用类似于cellfun的方

我有一个数组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循环中使用类似于
重塑(a(end-3:end,ii),2,2)
和循环
ii
的东西来实现这一点。有人能提出一种矢量化方法吗?也许可以使用类似于
cellfun
的方法,对数组的列重复应用操作

我这样做的方法是查看所需的索引,然后找出生成它们的方法,通常使用某种形式的repmat。例如,如果希望每列中的最后4项,则A中的(绝对)索引将为3,4,5,6,然后将行数添加到该索引中,以移动到下一列,得到9,10,11,12,依此类推。因此,问题变成了根据行数、列数和希望从每列中获得的元素数生成矩阵(在您的例子中,我称之为n=4)

根据生成x和y的方式,甚至可以取消乘法,但我将把它留给你们D

在我看来,你也不需要一个单元数组来存储它们,3D矩阵也可以工作,你可以用同样的方式索引到它(但是在使用它之前不要忘记使用它)


我在

中给出了类似的答案,我不确定您是否需要进行任何整形以达到您想要的效果。为什么不为i=1:3使用
B{i}=A((2*i-1):2*i,2:3)?你是否有一个性能问题促使你需要“矢量化”?啊,我发现我选择了一个令人困惑的例子。我使用的是列的最后四个元素,而不是a的平方子集。此外,这个简单的示例不需要额外的性能—我打算扩展它,从大量数据创建18x18阵列。从技术上讲,它也不需要它;我很想知道将来的参考资料。只是记录在案,谢谢Murph。同意3D矩阵,它很好地简化了事情。
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