在MATLAB中创建两个向量之间的关联映射

时间:2014-11-25 00:16:51

标签: matlab vector mapping

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

ind = [1 2 3 4];

和另一个与ind相同的大小,但其数量可能会有所不同:

vec=[46 91 9 10];

这两个向量彼此对应,所以我希望能够创建映射M,使M(46) = 1M(91) = 2等等。当然,使用全矩阵M的解决方案通常会非常浪费,因为它假定矩阵的大小等于vec的最大可能值。我怎么能压缩这个映射?

基本上我正在寻找与Python dict或C ++ std::map<int, int>解决的MATLAB等价物。

3 个答案:

答案 0 :(得分:3)

您需要map

M = containers.Map(vec, ind);

答案 1 :(得分:2)

如果vec已修复且您想要的内容不是很“重”,您可以像这样定义M

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

答案 2 :(得分:1)

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倍。