首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >matlab中的快速索引映射

matlab中的快速索引映射
EN

Stack Overflow用户
提问于 2015-01-13 22:29:19
回答 2查看 64关注 0票数 1

我有以下问题:给定一个矩阵A

代码语言:javascript
运行
复制
A = [ 1 2 2 3 3 ;
      2 2 2 7 9 ]

其中,矩阵中的唯一数序列不连续。在这个例子中

代码语言:javascript
运行
复制
unique(A) = [ 1 2 3 7 9 ]. % [ 4 5 6 8 ] are missing

我想要计算相同的矩阵,但是使用一个连续的序列,这样

代码语言:javascript
运行
复制
unique(A_new) = [ 1 2 3 4 5 ];

我想出了以下解决方案

代码语言:javascript
运行
复制
T = [ unique(A), [ 1:numel(unique(A)) ]' ];

A_new = zeros(size(A));

for i = 1:size(T,1)
  A_new( A == T(i,1) ) = T(i,2);
end

这是非常慢的:我必须使用的矩阵A的大小是200x400x300,这个矩阵中唯一元素的数量是33406。

知道如何加快手术速度吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-13 22:34:12

如果我理解正确,那么在您的示例中,您需要:

代码语言:javascript
运行
复制
A_new = [ 1 2 2 3 3 ;
          2 2 2 4 5 ]

因此,只需计算一个查找表(lookup)即可:

代码语言:javascript
运行
复制
A_new = lookup(A);

因此,在您的例子中,lookup应该是:

代码语言:javascript
运行
复制
[ 1 2 3 0 0 0 4 0 5 ]

我将把生成它的过程留给读者作为练习。

票数 1
EN

Stack Overflow用户

发布于 2015-01-13 22:55:16

方法1(不建议)

这应该相当快,但它使用更多的内存:

代码语言:javascript
运行
复制
[~, A_new] = max(bsxfun(@eq, A(:).', unique(A(:))));
A_new = reshape(A_new, size(A));

这是怎么工作的?

首先将A线性化为向量(A(:))。同时,计算包含A唯一值的向量(unique(A(:)))。从这两个向量生成一个矩阵(带有bsxfun),其中A的每个条目与每个唯一值进行比较。这样,对于A的每个条目,我们知道它是等于第一个唯一值,还是等于第二个唯一值,等等。对于在您的问题中给出的A,这个矩阵是

代码语言:javascript
运行
复制
 1     0     0     0     0     0     0     0     0     0
 0     1     1     1     1     1     0     0     0     0
 0     0     0     0     0     0     1     0     1     0
 0     0     0     0     0     0     0     1     0     0
 0     0     0     0     0     0     0     0     0     1

例如,条目(2,3)中的值1表示A(:)的第三个值等于A的第二个唯一值(即2)。右下角条目(5,10)中的1表示A(:)的第十个值是A的第五个唯一值(即9)。

现在,max的第二个输出用于提取每个列中1值的行位置(即获得上面示例中指示“第二”、“第五”等的数字)。这些都是预期的结果。它只剩下reshapeA的形状。

方法2(建议)

unique的第三个输出可以实现您想要的结果:

代码语言:javascript
运行
复制
[~, ~, labels] = unique(A);
A_new = reshape(labels, size(A));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27932681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档