说我有一个n x n
数组A
。是否有“好”的方式来做以下事情?
A_flat = reshape(A, [1, numel(A)]);
[dummy, A_index] = sort(A, 'descend');
A_row = mod(A_index - 1, size(A, 1)) + 1;
A_col = floor((A_index - 1) / size(A, 1));
通过“好”,我的意思是我正在寻找一种不使用for-loops的方法,不使用mod / floor,并且效率很高。 (我是MATLAB的新手,仍然不确定存在哪些函数以及期望内置函数的类型。)
答案 0 :(得分:0)
如果我正确理解您的代码,您将获得一个2D矩阵,您可以对此2D矩阵中的值进行排序。您当前执行此操作的方式是将值展开到矢量中,对此矢量进行排序并计算相应2D位置的位置。
这可以通过ind2sub
来实现。当您使用reshape
时,展开向量是以列主格式完成的,以便矩阵的列堆叠在一起。执行排序时,这也是使用列主要布局。以类似的方式,ind2sub
接受列主要索引并生成映射到每个索引的等效行和列位置。
sort
的第二个输出将为您提供每个值在列主格式中在排序结果中出现的位置。只需获取此结果并直接使用ind2sub
:
%// Your code
A_flat = reshape(A, [1, numel(A)]);
[dummy, A_index] = sort(A, 'descend');
%// New
[A_row, A_col] = ind2sub(size(A), A_index);