gpt4 book ai didi

arrays - 高级 Matlab : colon indexing of singleton dimension in assignment

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:27 25 4
gpt4 key购买 nike

在 Matlab 中考虑这个:

>> clear M, M(:,:,:,1,:)=rand(10,10,2,1,5); size(M)
ans =
10 10 2 1 5
>> clear M, M(:,:,:,1,:)=rand(10,10,1,1,5); size(M)
ans =
10 10 5
>> clear M, M(:,:,1,1,:)=rand(10,10,1,1,5); size(M)
ans =
10 10 1 1 5

为什么第二行代码的行为不像第一行和第三行那样? (即保持阵列的 5D 形状)

不是可以用冒号表示单例维度吗? (第二行代码中的第三维)

能否请您指出文档中相应的段落?

最佳答案

我找不到关于此事的任何具体文档,因此,除了推测之外,我将引用 Loren Shure 的一篇博文:“All about the Colon Operator”。其中大部分与这个问题无关。但是有一条特别的信息值得详细说明,我将以她结尾的一句话开头:

The : operator behaves differently in MATLAB depending on its usage. This can lead to confusion.

相关信息遵循 2×2 到 1×1×1×4 的分配。例如:

>> v(1,1,1,1:4) = 1:4;
>> v(:) = [5,6;7,8]
v(:,:,1,1) =
5
v(:,:,1,2) =
7
v(:,:,1,3) =
6
v(:,:,1,4) =
8

这项作业是如何进行的?洛伦解释说:

Notice that I only have to have the same number of elements on both the left- and right-hand sides. The values are poured in from the right-hand side ordered as if that array had been turned into a column vector.

因此,即使左侧和右侧对象的大小非常不同,赋值中索引-: 的出现也会强制右侧数组的形状,因为有元素等价。并且分配将被执行,就好像向量是列化的,并且 vreshape-d 到它的原始形状。


在继续讨论问题示例之前,我想指出尾随单维度(1 的下标)在 MATLAB 中的所有数组中都是无限隐含的。引用自Matrix Indexing :

The number of subscripts specified for [an array at assignment], not including trailing subscripts equal to 1, does not exceed ndims(B).

我们确实可以看到:

>> clear A; A(:,:,1,1,1,1,1,1,1,1,1) = rand(2,2)
A =
0.6355 0.7823
0.8439 0.2646
>> A(2,2,1,1,1,1,1,1,1,1,1)
ans =
0.2646
>> clear A; A = 5; A(1,1,1,1,1,1,1,1,1,1,1,1,1,1)
ans =
5

尾随的单例,例如乘以 1 或加零,总是在那里。


继续问题示例,我认为 indexing-: 在分配时分配的数组中的出现使 MATLAB 在弄清楚如何给定上述灵 active 的值。与 Loren 的示例不同,M 没有要保留的形状(给定前面的 clear),但赋值仍会将右侧的形状强制转换为类似列的形状向量。强制数组确实有一个形状。

很可能,直观的行为,给定代码原样,是在将其值分配给 M 时保留右侧的形状。然而,另一种观点可能是尽可能多地保留 M 的形状,从而最小化赋值结果的大小。

第一个行为是通过在赋值中没有任何索引而立即完成的。而且我认为后一种行为更符合 Loren 的说法,即“值从右侧倒入,就像该数组已变成列向量一样”。一旦右侧被列化,单维度基本消失,MATLAB 将尽可能多地填充每个 : 桶,同时尊重显式维度,例如 1 出现在示例中。

所以 M(:,:,:,1,:)=rand(10,10,2,1,5); 效果很好,因为 M 通过匹配右侧的大小来精确最小化。 M(:,:,:,1,:)=rand(10,10,1,1,5); size(M) 将在形状强制期间删除中间的单例,三个连续的赋值-: 将像桶一样用 10-15-5 数组填充以最小化大小输出和剩余的单例维度将被忽略,因为它们隐式存在。并且 M(:,:,1,1,:)=rand(10,10,1,1,5); 与第三个 之后的第一个完全一样: bucket 已替换为 MATLAB 将遵循的显式索引。

我不确定此行为中的任何地方是否存在明确的挤压,或者它是否只是形状强制转换的 MATLAB 引擎中某处的自然结果。所以我认为最好以这样的结尾说,如果数组的形状很重要,那么它应该尽可能明确地确定大小而不使用赋值索引。

关于arrays - 高级 Matlab : colon indexing of singleton dimension in assignment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44598599/

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