我有一个任意矩阵a = [1, 0, 0, 1]
。
我希望将每个0值替换为另一个矩阵b = [1, 2, 3]
的值,并将每1个值替换为另一个矩阵c = [3, 4, 5]
的值。
因此我最终会得到矩阵[3, 4, 5, 1, 2, 3, 1, 2, 3, 3, 4, 5]
。
我尝试找到0和1值的索引并用b和c替换这些索引的值,但这是不允许的,因为它们的大小不同。有没有简单的方法来实现这个目标?
答案 0 :(得分: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 :(得分: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
映射到b
,0
映射到c
。 for循环迭代a
构建一个包含映射值的更长的向量。
此代码将允许非顺序键,以便可以添加37并将其映射到另一个向量,而在上一个答案中,您必须将2
映射到下一个向量,以便代码不会断裂。