使用MATLAB,我想创建一个新的向量,其中原始向量中的值被另一个矩阵中的相应数字替换。
具体来说,我有一个大的向量(30,000 x 1)
,其中每个单元格中的各个值对应于大脑(range: 0 - 166)
中的位置。这些值在载体上有些随机分布(它们对应于大脑位置)。运行实验后,我现在想用我通过实验计算的值替换这些值的每个实例。这些值存储在相应的矩阵(167 x 2)
中:第一列包含原始矩阵(0 - 166)
中的值,第二列包含我想要替换原始值{{1}的新值}。例如,如果我的实验中值(0 - 6)
与得分150
相关联,我想将5
的每个实例替换为原始150
基质
原始载体:5
单位矩阵:[1; 1; 1; 1; 2; 2; 2; 2; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; ...]
新矢量:[0 0; 1 4; 2 5; 3 2; ...]
有一种简单的方法可以解决这个问题吗?
由于
答案 0 :(得分:5)
originalMatrix = [1; 1; 1; 1; 2; 2; 2; 2; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 0; 3];
identityMatrix = [0 0; 1 4; 2 5; 3 2];
[~,ind] = ismember(originalMatrix,identityMatrix(:,1));
map = identityMatrix(:,2);
result = map(ind);
修改强>
我一直收到这个错误:"下标索引必须是真正的正整数或逻辑。"
这是因为originalMatrix
中的某些值在identityMatrix
中没有相应的值。
所以你可以忽略它们,
ind(ind==0) = [];
答案 1 :(得分:2)
indCol=identityMatrix(:,2);
newVector=indCol(originalVector+1)
或者,在一行中:
newVector=identityMatrix(originalVector+168)
答案 2 :(得分:1)
我非常确定有一种更有效的方法,但这应该可以完成工作。 对于0-166范围内的每个值,我找到包含该值的原始矢量分量的索引。它存储在名为Indexes的向量中。然后我在new_vector中将名为identity_matrix(i,2)的新值放在此索引处。
new_vector = zeros(size(original_vector));
for i = 1:167
Indexes = find(original_vector == identity_matrix(i,1));
new_vector(Indexes) = identity_matrix(i,2);
end
答案 3 :(得分:0)
以下是使用bsxfun
和乘法(使用Kamtal答案的数据)的单线程:
originalMatrix = [1; 1; 1; 1; 2; 2; 2; 2; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 0; 3];
identityMatrix = [0 0; 1 4; 2 5; 3 2];
result = bsxfun(@eq,originalMatrix(:),identityMatrix(:,1)')*identityMatrix(:,2);