【问题标题】:Creating an association mapping between two vectors in MATLAB在 MATLAB 中创建两个向量之间的关联映射
【发布时间】:2014-11-25 00:16:51
【问题描述】:

我有两个 MATLAB 向量,其中一个是简单的升序向量,比如下面这个:

ind = [1 2 3 4];

和另一个大小与ind 相同,但数量可能不同:

vec=[46 91 9 10];

这两个向量彼此之间存在某种对应关系,因此我希望能够创建一个映射 M,例如 M(46) = 1M(91) = 2 等。当然,使用完整矩阵 M 的解决方案通常会非常浪费,因为它会假设一个矩阵的大小等于vec 的最大可能值。我怎样才能压缩这个映射?

本质上,我正在寻找 MATLAB 等价物,否则将使用 Python dict 或 C++ std::map<int, int> 解决。

【问题讨论】:

    标签: matlab vector mapping


    【解决方案1】:

    你想要一个map

    M = containers.Map(vec, ind);
    

    【讨论】:

      【解决方案2】:

      如果vec 是固定的,并且您想要的不是很“重”,您可以像这样定义M

      M = @(x)find(vec == x);
      

      【讨论】:

      • 为了更通用(如果 x 不是 1,2 的形式,...)我会使用 M = @(x) ind(find(vec == x));
      【解决方案3】:

      Matlab 最接近的内置函数是sparse 矩阵。限制是您必须预先指定最大可能的索引(尽管这可能非常大,但您无需支付任何费用)并且默认值(对于未分配的条目)必须始终为 0。但它会起作用:

      M = sparse( 20000000, 1 );
      M( vec ) = ind
      

      为了获得更大的灵活性,您可以创建自己的类,覆盖 subsrefsubsasgn 方法(大致相当于 Python 的 __getitem____setitem__)并将键和值存储在您自己的自定义中方式。不幸的是,根据我的经验,这种(面向对象的)解决方案在 Matlab 中往往非常缓慢。

      更新:Luis Mendo 的解决方案 M = containers.Map( vec, ind ) 更加优雅,更类似于等效的 C++ 和 Python 解决方案。我没有听说过containers.Map 类。如果时序性能对您的应用程序至关重要,我怀疑它会慢很多。我使用这些值的初步测试表明,从sparse 矩阵中检索比从containers.Map 中检索快大约 10 倍。

      【讨论】:

      • sparse 矩阵检索肯定比从Map 检索快得多,但创建Map 比创建sparse 矩阵要快得多,因此取决于OP 的具体情况代码可以更快。 sparse 矩阵方法实际上比我预期的要快得多!
      猜你喜欢
      • 2017-11-30
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多