1

MATLAB允许用其他数组索引数组。

通常结果具有相同的大小,但显然情况并非总是如此。

它必须与“列优先级”中的“列优先级”有关MATLAB

问题:

我想知道如何找到关于如何进入的一致解决[1 1]方案

size(index_array)==size(array(index_array))适用于所有尺寸的index_array.

具体来说,我发布了一个示例脚本:

baseAlt = [ 0, 11000, 20000, 32000, 47000, 51000, 71000 ];

xRow = 10000*[ 1, 2, 3, 4, 5];
xCol = 10000*[ 1; 2; 3; 4; 5];
 xSq = 20000* rand(5);

reg = arrayfun( @(alt) sum(alt>=baseAlt), xRow);
ans1 = baseAlt(reg);
disp(all(size(baseAlt(reg))==size(reg))); %ans=2

reg = arrayfun( @(alt) sum(alt>=baseAlt), xSq);
ans2 = baseAlt(reg);
disp(all(size(baseAlt(reg))==size(reg))); % ans=2

%BUUUUT
reg = arrayfun( @(alt) sum(alt>=baseAlt), xCol);
ans3 = baseAlt(reg);
disp(all(size(baseAlt(reg))==size(reg)));       % row, instead of column
                                                % zero when comparing size
%MOREOVER
reg = arrayfun( @(alt) sum(alt>=baseAlt), xCol);
ans4 = baseAlt([reg,reg]);
disp(all(size(baseAlt([reg,reg]))==size([reg,reg])));  % we get true here

如您所见,所有矩阵都保留了索引矩阵的形状,与ROW被 COL 索引的情况不同。任何人都可以阐明这一点吗?

编辑 1:使用“all”而不是“sum”,正如 Dani 指出的那样,这里更加优雅。

4

1 回答 1

0

我不知道索引以您显示的方式工作(尤其是索引向量的矩阵)。我也没有在 Matlab 文档中第一次看到这个。

您的第三个示例不起作用的原因是因为 Matlab 将索引向量解释为线性索引(无论是行向量还是列向量都是无关紧要的)。

您可以使用这个小的匿名函数轻松实现您想要的行为:

arrayIndexing = @(ar, ind)arrayfun(@(x)ar(x),ind);

使用您的示例代码(用于快速测试):

baseAlt = [ 0, 11000, 20000, 32000, 47000, 51000, 71000 ];
xRow = 10000*[ 1, 2, 3, 4, 5];
xCol = 10000*[ 1; 2; 3; 4; 5];
xSq = 20000* rand(5);
arrayIndexing = @(ar, ind)arrayfun(@(x)ar(x),ind);
reg = arrayfun( @(alt) sum(alt>=baseAlt), xSq);
result = arrayIndexing(baseAlt,reg);
disp(all(size(result)==size(reg))); % ans=1
reg = arrayfun( @(alt) sum(alt>=baseAlt), xCol);
result = arrayIndexing(baseAlt,reg);
disp(all(size(result)==size(reg)));  % ans=1

这适用于任何格式的索引向量/数组。

all注意代替的用法sum,我认为这是更合适的功能。

于 2014-05-15T10:59:35.630 回答