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
如您所见,所有矩阵都保留了索引矩阵的形状, APART 来自 ROW被COL 索引的情况。有人可以解释这个吗?
编辑1:使用“全部”而不是“总和”,正如达尼指出的那样,这里更加强大。
答案 0 :(得分: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
,我认为这是更合适的功能。