考虑每行上所有可能的排列,查找元胞数组的唯一行

2023-11-27

我有元胞数组A维度的m * k.

我想保留行A unique 最多为 k 个单元格.

“棘手”的部分是“最多为 k 个单元格”: 考虑k细胞中的i第 行A, A(i,:);可能会有一排j of A, A(j,:),这相当于A(i,:)直到重新排序k细胞,这意味着例如如果k=4可能是这样的:

A{i,1}=A{j,2}
A{i,2}=A{j,3}
A{i,3}=A{j,1}
A{i,4}=A{j,4}

我现在正在做的是:

G=[0 -1 1; 0 -1 2; 0 -1 3; 0 -1 4; 0 -1 5; 1 -1 6; 1 0 6; 1 1 6; 2 -1 6; 2 0 6; 2 1 6; 3 -1 6; 3 0 6; 3 1 6]; 
h=7;
M=reshape(G(nchoosek(1:size(G,1),h),:),[],h,size(G,2));
A=cell(size(M,1),2);
for p=1:size(M,1)
    A{p,1}=squeeze(M(p,:,:)); 
    left=~ismember(G, A{p,1}, 'rows');
    A{p,2}=G(left,:); 
end

%To find equivalent rows up to order I use a double loop (VERY slow).
indices=[]; 
for j=1:size(A,1)
    if ismember(j,indices)==0 %if we have not already identified j as a duplicate
        for i=1:size(A,1)
            if i~=j
               if (isequal(A{j,1},A{i,1}) || isequal(A{j,1},A{i,2}))...
                  &&...
                  (isequal(A{j,2},A{i,1}) || isequal(A{j,2},A{i,2}))...
                  indices=[indices;i]; 
               end
            end
        end
    end
end
A(indices,:)=[];

它有效,但速度太慢。我希望有一些更快的东西可以使用。


我想提出另一个想法,它在概念上与erfan's。我的想法使用散列函数,具体来说,GetMD5FEX提交.

主要任务是如何“减少”中的每一行A到单个代表值(例如字符向量),然后找到该向量的唯一条目。

Judging by the benchmark vs. the other suggestions, my answer doesn't perform as well as one of the alternatives, but I think its raison d'être lies in the fact that it is completely data-type agnostic (within the limitations of the GetMD51), that the algorithm is very straightforward to understand, it's a drop-in replacement as it operates on A, and that the resulting array is exactly equal to the one obtained by the original method. Of course this requires a compiler to get working and has a risk of hash collisions (which might affect the result in VERY VERY rare cases).

以下是在我的计算机上典型运行的结果,后面是代码:

Original method timing:     8.764601s
Dev-iL's method timing:     0.053672s
erfan's method timing:      0.481716s
rahnema1's method timing:   0.009771s

function q39955559
G=[0 -1 1; 0 -1 2; 0 -1 3; 0 -1 4; 0 -1 5; 1 -1 6; 1 0 6; 1 1 6; 2 -1 6; 2 0 6; 2 1 6; 3 -1 6; 3 0 6; 3 1 6]; 
h=7;
M=reshape(G(nchoosek(1:size(G,1),h),:),[],h,size(G,2));
A=cell(size(M,1),2);
for p=1:size(M,1)
    A{p,1}=squeeze(M(p,:,:)); 
    left=~ismember(G, A{p,1}, 'rows');
    A{p,2}=G(left,:); 
end

%% Benchmark:
tic
A1 = orig_sort(A);
fprintf(1,'Original method timing:\t\t%fs\n',toc);

tic
A2 = hash_sort(A);
fprintf(1,'Dev-iL''s method timing:\t\t%fs\n',toc);

tic
A3 = erfan_sort(A);
fprintf(1,'erfan''s method timing:\t\t%fs\n',toc);

tic
A4 = rahnema1_sort(G,h);
fprintf(1,'rahnema1''s method timing:\t%fs\n',toc);

assert(isequal(A1,A2))
assert(isequal(A1,A3))
assert(isequal(numel(A1),numel(A4)))  % This is the best test I could come up with...

function out = hash_sort(A)
% Hash the contents:
A_hashed = cellfun(@GetMD5,A,'UniformOutput',false);
% Sort hashes of each row:
A_hashed_sorted = A_hashed;
for ind1 = 1:size(A_hashed,1)
  A_hashed_sorted(ind1,:) = sort(A_hashed(ind1,:));
end
A_hashed_sorted = cellstr(cell2mat(A_hashed_sorted));
% Find unique rows:
[~,ia,~] = unique(A_hashed_sorted,'stable');
% Extract relevant rows of A:
out = A(ia,:);

function A = orig_sort(A)
%To find equivalent rows up to order I use a double loop (VERY slow).
indices=[]; 
for j=1:size(A,1)
    if ismember(j,indices)==0 %if we have not already identified j as a duplicate
        for i=1:size(A,1)
            if i~=j
               if (isequal(A{j,1},A{i,1}) || isequal(A{j,1},A{i,2}))...
                  &&...
                  (isequal(A{j,2},A{i,1}) || isequal(A{j,2},A{i,2}))...
                  indices=[indices;i]; 
               end
            end
        end
    end
end
A(indices,:)=[];

function C = erfan_sort(A)
STR = cellfun(@(x) num2str((x(:)).'), A, 'UniformOutput', false);
[~, ~, id] = unique(STR);
IC = sort(reshape(id, [], size(STR, 2)), 2);
[~, col] = unique(IC, 'rows');
C = A(sort(col), :); % 'sort' makes the outputs exactly the same.

function A1 = rahnema1_sort(G,h)
idx = nchoosek(1:size(G,1),h);
%concatenate complements
M = [G(idx(1:size(idx,1)/2,:),:), G(idx(end:-1:size(idx,1)/2+1,:),:)];
%convert to cell so A1 is unique rows of A
A1 = mat2cell(M,repmat(h,size(idx,1)/2,1),repmat(size(G,2),2,1));

1 - If more complicated data types need to be hashed, one can use the DataHash FEX submission instead, which is somewhat slower.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

考虑每行上所有可能的排列,查找元胞数组的唯一行 的相关文章

  • 如何使用 PHP 以任意顺序进行字符搜索(12 个字母,其中 6 个字母构成一个单词)?

    我整天都在想这个问题 似乎无法找出一种记忆有效且快速的方法 问题是 例如 我有这些信 e f j l n rr t t u w x 12 个字母 我正在找这个词 海龟 6 个字母 如何使用 php 找到完整范围 12 个单词 中所有可能的单
  • Java中的递归排列生成错误结果

    问题是生成字典排列 起初 我的代码是这样的 public class Problem24 public static void main String args permutation 123 public static void perm
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 加快写入文件的速度

    我已经分析了一些我用 cProfile 继承的遗留代码 我已经做了很多有帮助的更改 例如使用 simplejson 的 C 扩展 基本上 该脚本将数据从一个系统导出到 ASCII 固定宽度文件 每一行都是一条记录 并且有许多值 每行有 71
  • setInterval() 如何影响性能?

    我们正在使用 Twitter Bootstrap 作为框架构建一个 Web 应用程序 但在显示 隐藏工具提示时遇到问题 除了尝试找到实际问题的解决方案之外 我还有一个关于我们同时使用的解决方法的问题 从性能角度来看 使用 setInterv
  • 字符串与 StringBuilder

    我理解之间的区别String and StringBuilder StringBuilder是可变的 但是两者之间有很大的性能差异吗 我正在开发的程序有很多大小写驱动的字符串附加 500 正在使用StringBuilder更好的选择 是的
  • 为单个方法引用大 DLL

    我想在 C 中使用大型类库 dll 中的单个方法 是否有性能或其他方面的缺点 我应该使用反射工具 读取 方法代码并将其复制粘贴到我的项目中吗 更新 硬盘空间不是问题 我的应用程序是网络应用程序 是否有性能或其他方面的缺点 唯一真正重要的是可
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 渲染 ThreeJS 应用程序第一帧时的性能问题

    目前 当我渲染以下内容时 我的 ThreeJS 应用程序的性能受到很大影响第一帧 它会导致 Edge 和 IE 11 浏览器冻结 5 秒 并弹出窗口指示 此窗口没有响应 这可能会吓到我的用户 使用 Chrome 的性能分析器 问题似乎来自几
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后

随机推荐

  • 使用c# selenium webdriverWait wait.untill()函数时忽略异常

    为了检查元素是否存在并且可点击 我尝试编写一个布尔方法 该方法将等待元素启用并使用 C selenium webDriverWait 显示 如下所示 webDriverWait wait new webDriverWait driver t
  • 按值对哈希表进行排序

    如果我有一个哈希表 并且我想按值对其进行排序 即 按降序排列的整数 我怎样才能做到这一点并能够打印所有键值对 传输为列表并排序 public static void sortValue Hashtable
  • 关于范围的变量的最佳声明

    我问这个问题主要是关于 C 编程 但欢迎对任何语言的见解 当谈到 C 时 我知道它只允许变量声明出现在代码块的最开始处 我的印象是 应该在函数的一开始就声明函数中要使用的所有变量 但在很多情况下 我都会有一个仅在循环 或类似块 中使用的变量
  • C# 引用变量的内存分配

    有谁知道创建引用类型变量时占用了多少内存 字符串 s 123 s 作为引用 而不是指向它的数据 会占用多少内存 这可以按以下方式细分 String s 123 变量s 这将消耗当前架构上的本机指针大小 如果操作系统是 32 位或进程在 Wo
  • 如何使用 PHP 检测爬虫/蜘蛛?

    如何使用 PHP 检测爬虫 蜘蛛 我目前正在开发一个项目 需要跟踪每个爬虫的访问情况 我知道您应该使用 HTTP USER AGENT 但我不太确定如何为此目的格式化代码 并且我知道 USER AGENT 可以很容易地更改 所以我还想知道是
  • 如何强制 Java 子类定义 Annotation?

    如果一个类定义了一个注释 是否可以强制其子类定义相同的注释 例如 我们有一个简单的类 子类对 它们共享 Author interface 我想做的是强制每个进一步的子类定义相同的 Author注释 防止RuntimeException沿着路
  • 如何使用 SAM 部署来获取 lambda,以及 AutoPublishAlias 和其他别名

    我的目标是额外SAM deploy调用将导致 staging 别名反映最新版本 并且 live 将通过外部方式更新 但必须初始化为部署时创建的相同版本 我正在使用 SAM 部署 并且需要 lambda 上的别名 在初始模板中添加它们很棘手
  • 刷新片段不再起作用?

    今天我损失了几个小时 因为我的代码不再工作 更新到新版本的支持库 25 1 0 后 重新加载片段视图的代码不再起作用 这是我的代码 FragmentManager manager getActivity getSupportFragment
  • 使用 Pyramid 对所有 HTTP 流量进行压缩

    我正在创建基于金字塔框架的移动服务 因为它是移动的 所以减少带宽使用是有利的 我正在考虑压缩所有流量 甚至是动态 HTML 页面 Pyramid 框架为此提供了什么样的钩子 或者是否有用于该任务的 WSGI 中间件 我仍然想在 Python
  • 使用分治法从给定列表中查找第二小的数字

    我正在努力解决这个问题 给定一个包含 n 个数字的列表 我们希望找到最小的和第二小的 列表中的数字 描述一个分而治之的算法来解决这个问题 假设整数 k 为 n 2 k 使用您的算法的比较次数应该 即使在最坏的情况下 也不会超过 3n 2 2
  • WinForms - 哪种是保存某些数据最简单的方法?

    刚刚构建我的第一个 WinForms 应用程序 问题 在使用应用程序之间保存一些数据的最简单 最佳方法是什么 例如 在本例中包含状态和日期 时间的 URL 列表 我认为不需要数据库 例如 仅仅存储到文本文件是最简单的吗 或者在 DotNet
  • UseWindowsAzureActiveDirectoryBearerAuthentication 如何验证令牌?

    我按照下面的 GitHub 示例来实现跨 WebApp 和 WebApi 的身份验证机制 https github com AzureADSamples WebApp WebAPI OpenIDConnect DotNet 我正在为 Web
  • Angular 圆形模块导入

    我有两个模块 其组件相互使用 所以我必须在 test 中导入 word 在 word 中导入 test gt 抛出错误 我该怎么办 模块 测试 NgModule declarations AppTest1Component AppTest2
  • Websphere 所有日志都将转到 SystemOut.log

    我在我的应用程序中使用 Log4j 并有一些用于调试和错误的附加程序 我在tomcat上测试过 工作正常 在各自的文件中生成所有日志 但是当我在 WAS6 1 上部署代码时 所有日志仅在 SystemOut log 内生成 请帮忙 问题可能
  • VS 11 Beta 无法启动进程,因为尚未提供文件名

    这是我构建测试项目时得到的结果 这样我就无法运行我的测试 因为 VS 没有发现它们 查看留言 Unexpected error detected Check the Tests Output Pane for details 在窗口底部 现
  • 我怎样才能让 gitbash 找到 javac 命令?

    我创建了我的 git 存储库并提交了它 插入一个java文件并想要编译它 但它给了我这个 Bernard BERNARD PC c users bernard desktop git2 master javac TestGUI java s
  • Clang 链接器问题(从源代码到 gcc-snapshot)

    我似乎无法让它发挥作用 我配置了 with gcc toolchain 在 equals 之后我把 gcc 所在的目录 usr lib gcc snapshot bin 我还查看了 clang 链接器问题 但我不知道如何获得接受的答案来找到
  • Volley Android 网络库

    关于在我的项目中使用 Volley 我有几个问题 这个库可以在任何 Java 项目中使用还是只能在 Android 项目中使用 我看到多个分支here并且没有关于从哪个分支开始的文档 我应该从哪个分支开始 您如何将该库集成到您自己的项目中
  • Typescript:Promise 的子类/扩展:不引用 Promise 兼容的构造函数值

    我正在尝试取消我的asyncTypescript 中的方法调用 为此 我创建了一个新的 Promise 类型 它继承自Promise class CancelablePromise
  • 考虑每行上所有可能的排列,查找元胞数组的唯一行

    我有元胞数组A维度的m k 我想保留行A unique 最多为 k 个单元格 棘手 的部分是 最多为 k 个单元格 考虑k细胞中的i第 行A A i 可能会有一排j of A A j 这相当于A i 直到重新排序k细胞 这意味着例如如果k