我有两个MATLAB向量,其中一个是简单的升序向量,如下所示:
ind = [1 2 3 4];
和另一个与ind
相同的大小,但其数量可能会有所不同:
vec=[46 91 9 10];
这两个向量彼此对应,所以我希望能够创建映射M,使M(46) = 1
,M(91) = 2
等等。当然,使用全矩阵M的解决方案通常会非常浪费,因为它假定矩阵的大小等于vec
的最大可能值。我怎么能压缩这个映射?
基本上我正在寻找与Python dict
或C ++ std::map<int, int>
解决的MATLAB等价物。
答案 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
为了获得更大的灵活性,您可以创建自己的类,使subsref
和subsasgn
方法(分别与Python的__getitem__
和__setitem__
大致相同)和存储大打折扣您自定义方式的键和值。不幸的是,根据我的经验,这种(面向对象的)解决方案在Matlab中往往非常慢。
更新:Luis Mendo的解决方案M = containers.Map( vec, ind )
更优雅,更类似于等效的C ++和Python解决方案。我没有听说过containers.Map
班。我怀疑它会慢很多,如果时序性能对你的应用程序至关重要。我使用这些值进行的初步测试表明,从sparse
矩阵中检索的速度比从containers.Map
检索的速度快10倍。