Arrays 数组中列的矢量化重塑
我有一个数组A,我想把每列的最后四个元素重塑成一个2x2矩阵。我希望结果存储在单元格数组B中 例如,假设: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 = [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