Matlab 如何使用约束重塑多个标注的形状
我一直试图通过重塑来实现这种行为。我是matlab新手,所以我一直在努力 我有一个 3 x 2 x 5矩阵称为 我想合并维度1到5,不包括4。在组合它们时,我希望按顺序保留每行中的列 我知道我可以做像这样的事情 A=重塑(A[12,2,1]),但我担心的是,这可能不会保留每行中列的顺序,也不允许我排除维度 例如: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
(:,:,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) 您在回答中固定了维度大小,使代码段无法概括。