我有一个矩阵,如
M = [ 1 3 2 4;
3 3 2 1;
2 4 1 3]
,其基数为A = [ 1 2 3 4];
我还有另一个基地B = [103 104 105 106];
我需要用M中的B值替换A的值。所以我的新M应该是:
M1 = [ 103 105 104 106;
105 105 104 103;
104 106 103 105];
元素是随机数,所以我需要在A和B之间使用indice一对一连接。 我应该提一下吗?当然不是为了LOOPS:D 感谢
答案 0 :(得分:6)
这是你的单行:
sum(bsxfun(@times, bsxfun(@eq, M, reshape(A,1,1,[])), reshape(B,1,1,[])), 3)
它相当快。
以下是基准测试代码:
%// bsxfun party
tic
for k = 1:10000
M1 = sum(bsxfun(@times,bsxfun(@eq,M,reshape(A,1,1,[])),reshape(B,1,1,[])),3);
end
toc
%// Using ismember
tic
for k = 1:10000
[idx,b] = ismember(M,A);
M(idx) = B(b(idx));
end
toc
%// Using a simple loop
tic
for k = 1:10000
M1 = M;
for t = 1:length(A)
M1(M == A(t)) = B(t);
end
end
toc
结果是:
Elapsed time is 0.030135 seconds.
Elapsed time is 0.094354 seconds.
Elapsed time is 0.007410 seconds.
所以这个单行程比ismember
的优雅解决方案更快,但简单(JIT加速)循环比两者都快。令人惊讶,不是吗? :)
答案 1 :(得分:4)
如果您确定新M
包含仅元素来自新基地(旧M
和旧基础相同),您可以使用第二个输出ismember
:
>> [~,b] = ismember(M,A);
>> M = B(b)
M =
103 105 104 106
105 105 104 103
104 106 103 105
答案 2 :(得分:2)
如果你的基地是旧基地的一个简单功能,那么它可能是微不足道的:
M1 = M + 102;
否则这是一种方式:
M1 = M
for t = 1:length(A)
M1(M==A(t)) = B(t)
end
根据@Rody的答案另一个解决方案:
[idx,b] = ismember(M,A);
M(idx) = B(b(idx))
不同之处在于,如果A
不包含M
的所有元素,则不会中断。 (如果是正确的基础,可能不应该发生。)