Arrays MATLAB中矩阵值的替换

Arrays MATLAB中矩阵值的替换,arrays,matlab,replace,Arrays,Matlab,Replace,我有一个矩阵,比如 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之间使用一对一的连接。 我应该提一下吗?当然没有循环:D 谢谢

我有一个矩阵,比如

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之间使用一对一的连接。 我应该提一下吗?当然没有循环:D
谢谢

如果您的基础是旧基础的简单功能,那么它可能是微不足道的:

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
的所有元素,则不会中断。(如果这是一个适当的基础,可能不应该发生)。

这里有一个简单的例子:

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加速)循环比这两个都快。令人惊讶,不是吗?:)

如果您确定新的
M
只包含来自新基的元素(旧的
M
和旧基相同),则可以使用
ismember
的第二个输出:

 >> [~,b] = ismember(M,A);      
 >> M = B(b)
 M =
    103   105   104   106
    105   105   104   103
    104   106   103   105

优雅,但比循环慢得出奇:)我希望得到的!稍微编辑一下,如果不是
M
的所有元素都出现在
A
@DennisJaheruddin中,它也会起作用:当我提到的那些条件保持不变时,可以省略
idx
。我认为在这种情况下,省略它们更为优雅,所以如果你不介意的话,我将回滚。@DennisJaheruddin:啊,我认为你编辑了一个旧版本:)@EitanT:令人惊讶?很难,如果你看一下
edit ismember
:)最后一个可能是我自己喜欢的。