gpt4 book ai didi

arrays - 数组中列的矢量化 reshape

转载 作者:行者123 更新时间:2023-12-02 05:05:31 26 4
gpt4 key购买 nike

我有一个数组 A,想要将每列的最后四个元素 reshape 为 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];

我显然可以使用诸如 reshape(A(end-3:end, ii), 2, 2) 之类的方法在 for 循环中执行此操作并循环 ii 。任何人都可以提出一种矢量化方法,也许使用类似于 cellfun 的方法来重复对数组的列应用操作?

最佳答案

我这样做的方法是查看所需的索引,然后找出生成它们的方法,通常使用某种形式的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. 中给出了类似的答案

关于arrays - 数组中列的矢量化 reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com