Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB:用整数数组索引数组_Arrays_Matlab_Matrix Indexing - Fatal编程技术网

Arrays MATLAB:用整数数组索引数组

Arrays MATLAB:用整数数组索引数组,arrays,matlab,matrix-indexing,Arrays,Matlab,Matrix Indexing,MATLAB允许使用其他数组对数组进行索引 通常结果大小相同,但显然情况并非总是如此 它必须与MATLAB中的列优先级有关 问题: 我想知道如何找到一个一致的解决方案来获得[1] sizeindex_数组==所有大小的索引数组的sizearrayindex_数组 具体来说,我发布了一个示例脚本: baseAlt = [ 0, 11000, 20000, 32000, 47000, 51000, 71000 ]; xRow = 10000*[ 1, 2, 3, 4, 5]; xCol = 100

MATLAB允许使用其他数组对数组进行索引

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

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

问题:

我想知道如何找到一个一致的解决方案来获得[1]

sizeindex_数组==所有大小的索引数组的sizearrayindex_数组

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

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
正如您所看到的,除了行被列索引的情况外,所有的矩阵都保留了索引矩阵的形状。有人能解释一下吗


编辑1:使用all而不是sum,正如Dani指出的,这里的sum更为重要。

我不知道索引的工作方式与您显示的矩阵索引向量的方式相同。我也没有第一次在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的用法,我认为它是这里更合适的函数。

我知道arrayfun,它与任何类型无关的函数一样,速度较慢。关于是否使用for、arrayfun或vectoriation的主题在这里讨论得很好:这就是为什么我想避免使用arrafuns,它主要嵌套在其他arrayfuns中,当您有更多的矩阵要处理时就是这样。总之,我想使用MATLAB灵活的索引框架。ofc all是更合适的函数!好吧,如果速度是关键的话,那么排列拳不是最好的选择,这是真的。但我认为你不会回避整个“索引向量”=>“线性索引”问题。我所能想到的就是编写一个函数,基本上按照您描述的那样进行索引,然后检查索引是否是列向量,如果是,则转换输出。不漂亮,但我认为这是最直接的方法——AFAIK。我现在就是这样做的,因为我的快速方法出错的唯一情况是当一行遇到一列时。所以我使用大小检查进行if,最终会转置“baseAlt”。作为一个纯粹主义者,我不喜欢它。。。因此,我的问题是:但也许其他人会证明,使用“isrow/isvector”实际上是摆脱线性索引、重新排列等业务的最干净的方法。