2017-09-07 367 views
1

我有一个任意矩阵,a = [1, 0, 0, 1]MATLAB用另一个矩阵替换矩阵的某些值

我想用另一个矩阵b = [1, 2, 3]的值替换每个0值,并且每个值都用另一个矩阵的值c = [3, 4, 5]替换。

因此,我会结束矩阵[3, 4, 5, 1, 2, 3, 1, 2, 3, 3, 4, 5]

我试过找到0和1值的索引,并用b和c替换那些索引的值,但这是不允许的,因为它们不是相同的大小。有没有简单的方法来实现这一点?

+0

'b'和'c'会有相同的尺寸吗? –

回答

3

鉴于

a = [1, 0, 0, 1]; 
b = [1, 2, 3]; 
c = [3, 4, 5]; 

让我们先来我们想在最后的矩阵阵列,并把他们在单元阵列:

parts = {b, c} 
parts = 
{ 
    [1,1] = 
    1 2 3 
    [1,2] = 
    3 4 5 
} 

的目标是使用的a值作为索引到parts,但要做到这一点,我们需要所有的值从1到一些n(如果有缺失的值,它将需要更多的工作)是积极的。在这种情况下,我们可以只增加a

a_inds = a + 1 
a_inds = 
    2 1 1 2 

现在我们可以通过做parts(a_inds)一个新的单元阵列,或基体加入cell2mat

result = cell2mat(parts(a_inds)) 
result = 
    3 4 5 1 2 3 1 2 3 3 4 5 
+1

我正在写这篇文章:-) –

+2

@LuisMendo我看到了,偷走了你的答案。忍者布偶! ;) – beaker

0

这也可以一键完成:价值地图。

a = [1, 0, 0, 1]; 
b = [1, 2, 3]; 
c = [3, 4, 5]; 

keyset = [1,0]; 
valueset = {b,c}; 

mapobj = containers.Map(keyset,valueset); 
new_vec = []; 
for i =1:length(a) 
    new_vec(length(new_vec)+1:length(new_vec)+length(mapobj(a(i))))= mapobj(a(i)); 
end 

1被映射到b0映射到c。 for循环遍历a构建一个包含映射值的更长的向量。

此代码将允许非连续的键,以便可以将37添加并映射到另一个向量,而在上一个答案中,您必须将2映射到下一个向量才能使代码不中断。

相关问题