Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-14, 20:46   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 以显式领带(重复元素)分辨率排序

默认情况下,MATLAB的sort函数通过保留元素的顺序来处理关系/重复的元素,即

>> [srt,idx] = sort([1 0 1]) srt = 0 1 1 idx = 2 1 3 请注意,输入中值为1的两个元素分别被分别分配了索引2和3。 idx = [3 1 2],但是,将同样有效。

我想要一个函数[srt,all_idx] = sort_ties(in),该函数显式返回与排序的输出一致的idx的所有可能值。当然,这仅在关系或重复元素的情况下才会发生,并且all_idx的尺寸为nPossibleSorts x length(in)。

我开始使用递归算法来执行此操作,但是很快就意识到事情已经变得一发不可收拾,而且一定有人之前已经解决了这个问题!有什么建议么?



回答:

我和RM建议的想法类似。然而,该解决方案被普遍化为处理输入向量中任意数量的重复元素。代码首先(使用函数SORT )对输入进行排序 ,然后循环遍历每个唯一值以生成该值的索引的所有排列(使用函数PERMS ),并将结果存储在单元格数组中。然后,通过使用函数KRONREPMAT适当地复制它们,将每个单个值的这些索引置换组合为排序索引的置换总数

function [srt,all_idx] = sort_ties(in,varargin) [srt,idx] = sort(in,varargin{:}); uniqueValues = srt(logical([1 diff(srt)])); nValues = numel(uniqueValues); if nValues == numel(srt) all_idx = idx; return end permCell = cell(1,nValues); for iValue = 1:nValues valueIndex = idx(srt == uniqueValues(iValue)); if numel(valueIndex) == 1 permCell{iValue} = valueIndex; else permCell{iValue} = perms(valueIndex); end end nPerms = cellfun('size',permCell,1); for iValue = 1:nValues N = prod(nPerms(1:iValue-1)); M = prod(nPerms(iValue+1:end)); permCell{iValue} = repmat(kron(permCell{iValue},ones(N,1)),M,1); end all_idx = [permCell{:}]; end 以下是一些示例结果:

>> [srt,all_idx] = sort_ties([0 2 1 2 2 1]) srt = 0 1 1 2 2 2 all_idx = 1 6 3 5 4 2 1 3 6 5 4 2 1 6 3 5 2 4 1 3 6 5 2 4 1 6 3 4 5 2 1 3 6 4 5 2 1 6 3 4 2 5 1 3 6 4 2 5 1 6 3 2 4 5 1 3 6 2 4 5 1 6 3 2 5 4 1 3 6 2 5 4

更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 23:44


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.