Matlab 如何使用约束重塑多个标注的形状

Matlab 如何使用约束重塑多个标注的形状,matlab,Matlab,我一直试图通过重塑来实现这种行为。我是matlab新手,所以我一直在努力 我有一个 3 x 2 x 5矩阵称为 我想合并维度1到5,不包括4。在组合它们时,我希望按顺序保留每行中的列 我知道我可以做像这样的事情 A=重塑(A[12,2,1]),但我担心的是,这可能不会保留每行中列的顺序,也不允许我排除维度 例如: (:,:,1) = 0.3168 3.1825 1.5841 1.5766 -0.7892 3.0073 (:,:,2) = -0.2131 3.970

我一直试图通过重塑来实现这种行为。我是matlab新手,所以我一直在努力

我有一个

3 x 2 x 5矩阵称为

我想合并维度1到5,不包括4。在组合它们时,我希望按顺序保留每行中的列

我知道我可以做像这样的事情

A=重塑(A[12,2,1]),但我担心的是,这可能不会保留每行中列的顺序,也不允许我排除维度

例如:

(:,:,1) =

0.3168    3.1825
1.5841    1.5766
-0.7892    3.0073


(:,:,2) =

-0.2131    3.9708
2.9435    0.4964
-0.2131    2.5985

(:,:,3) =

0.5012    -3.5328
0.4551    2.1314
-1.5956    3.4161

(:,:,4) =

-0.12    -3.28
-0.51    -2.14
-1.56    -3.61


(:,:,5) =

6.5012    3.538
0.4551    0.314
-0.5956    0.411
输出,比如说,合并除第四个维度之外的所有维度

0.3168    3.1825
1.5841    1.5766
-0.7892    3.0073
-0.2131    3.9708
2.9435    0.4964
-0.2131    2.5985
0.5012    -3.5328
0.4551    2.1314
-1.5956    3.4161
6.5012    3.538
0.4551    0.314
-0.5956    0.411

如您所述,通过巧妙地使用
重塑
,以及索引,您可以实现您想要的。此外,您还需要使用
permute
(可切换维度),因为您希望保持每个“切片”的完整性

首先,很高兴知道可以使用索引排除第四个切片。考虑下面的例子:

A = randi(100,3,2,5)
idxdim3 = [1,2,3,5];     % Create an array of integers corresponding to the slices you want
B = A(:,:,idxdim3)       % Extract all the slices you want, discarding the 4th
在本例中,这将为您留下一个大小为[3 x 2 x 4]的数组。接下来,您可以尝试使用
重塑
,但会遇到问题<代码>重塑向上扩展维度,列是第一个维度,行是第二个维度,“切片”是第三个维度。正如您所说的,您希望保持每行中的列的顺序,但是
重塑
将在第三维开始工作之前更改这些列。因此,我们需要使用
permute
将第二维度和第三维度切换放在第一位:

% Leave 1 as the first dimension, but switches dimensions 2 and 3 around:
C = permute(B,[1 3 2]);      
现在,我们可以将重塑为合适的大小:

D = reshape(C,[12 2 1]);
这会给你你想要的结果。当然,我们可以将这些语句中的大多数组合成一行,如下所示:

A = randi(100,3,2,5);  % Put your data here instead
idxdim3 = [1,2,3,5];
B = reshape( permute( A(:,:,idxdim3), [1 3 2]), 12, 2);
注意:如果将来使用不同尺寸的
A
,如果指定其他尺寸,则可以让
重塑
计算其中一个尺寸。以下工作也将起作用:

B = reshape( permute( A(:,:,idxdim3), [1 3 2]), [], 2);
重塑
将为您计算
12

示例输出:

A(:,:,1) =
44    80
39    19
77    49
A(:,:,2) =
45    76
65    28
71    68
A(:,:,3) =
66    50
17    96
12    35
A(:,:,4) =
59    26
23    51
76    70
A(:,:,5) =
90    14
96    15
55    26

B =
44    80
39    19
77    49
45    76
65    28
71    68
66    50
17    96
12    35
90    14
96    15
55    26

您需要结合使用
置换
重塑

% delete A[:,:,4]
B = A(:,:,[1:3,5])
% permute dimension 2 and 3, because you want to concatenate your array according to the 3nd dimension before the 2nd dimension.
C = permute(B,[1 3 2])
% Use reshape with the first parameter beeing '[]' so matlab will automatically compute the number of line needed, the number of column is fixed: it's 2 or size(B,2)
C = reshape(C,[],size(B,2))

我不想粗鲁,但为什么你会发布一个与我的答案完全相同的信息和解决方案,甚至是相同的变量名?你没有提供我没有提供的任何东西,你的回答是在我的回答一小时后添加的。看起来你真的是从我的答案中复制了代码行,并将它们发布到了你自己的答案中。@Florisa嗨,我在你的答案发布6分钟后发布了这个答案,在我发布我的答案之前,我还没有注意到已经发布了一个答案。我没有删除我的答案有两个原因:1)我认为你的答案太长,所以很难在不到15秒钟内获得主要信息。2) 您在回答中固定了维度大小,使代码段无法概括。