我有以下问题:给定一个矩阵A
A = [ 1 2 2 3 3 ;
2 2 2 7 9 ]其中,矩阵中的唯一数序列不连续。在这个例子中
unique(A) = [ 1 2 3 7 9 ]. % [ 4 5 6 8 ] are missing我想要计算相同的矩阵,但是使用一个连续的序列,这样
unique(A_new) = [ 1 2 3 4 5 ];我想出了以下解决方案
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。
知道如何加快手术速度吗?
发布于 2015-01-13 22:34:12
如果我理解正确,那么在您的示例中,您需要:
A_new = [ 1 2 2 3 3 ;
2 2 2 4 5 ]因此,只需计算一个查找表(lookup)即可:
A_new = lookup(A);因此,在您的例子中,lookup应该是:
[ 1 2 3 0 0 0 4 0 5 ]我将把生成它的过程留给读者作为练习。
发布于 2015-01-13 22:55:16
方法1(不建议)
这应该相当快,但它使用更多的内存:
[~, A_new] = max(bsxfun(@eq, A(:).', unique(A(:))));
A_new = reshape(A_new, size(A));这是怎么工作的?
首先将A线性化为向量(A(:))。同时,计算包含A唯一值的向量(unique(A(:)))。从这两个向量生成一个矩阵(带有bsxfun),其中A的每个条目与每个唯一值进行比较。这样,对于A的每个条目,我们知道它是等于第一个唯一值,还是等于第二个唯一值,等等。对于在您的问题中给出的A,这个矩阵是
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值的行位置(即获得上面示例中指示“第二”、“第五”等的数字)。这些都是预期的结果。它只剩下reshape成A的形状。
方法2(建议)
unique的第三个输出可以实现您想要的结果:
[~, ~, labels] = unique(A);
A_new = reshape(labels, size(A));https://stackoverflow.com/questions/27932681
复制相似问题