有两个矩阵;第一个是我的输入矩阵
第二个(“重命名矩阵”)用于替换第一个的值
也就是看重命名矩阵;701 必须替换为 1,...,717 必须替换为 10 等.. 这样输入矩阵就变成了这样
这 ?值已定义,但我没有放它们。输入矩阵的第二列已经排序(从上到下的升序),但值不是连续的(没有“710”:见第一张图片)。
问题是如何从前两个中获取输出矩阵(最后一张图片)。
在我看来,它正在为稀疏矩阵解决方案而尖叫。在 matlab 中,您可以使用以下命令创建一个稀疏矩阵:
SM = sparse( ri, ci, val );
其中 ri 是非零元素的行索引,ci 是相应的列索引,val 是值。
让我们调用您的输入矩阵IM
和查找矩阵LUM
,然后我们构造稀疏矩阵:
nr = size(LUM, 1);
SM = sparse( ones(nr, 1), LUM(:, 1), LUM(:, 2) );
现在我们可以在一行中得到你的结果:
newMatrix = reshape(SM(1, IM), size(IM));
几乎是魔法。
我今晚没有机会检查这个 - 但如果它不能完全按照描述的那样工作,它应该真的很接近......
如果第一列中的值都出现在第二列中,并且您想要的只是将第二列中的值替换为1..n
并相应地更改第一列中的值,您可以通过简单的调用来完成所有这些操作ismember
:
%# define "inputMatrix" here as the first array in your post
[~,newFirstColumn] = ismember(inputMatrix(:,1),inputMatrix(:,2));
要创建输出,您可以编写
outputMatrix = [newFirstColumn,(1:length(newFirstColumn))'];
如果M
是原始矩阵并且R
是重命名矩阵,这是您的操作方法
N = M;
for n = 1:size(M,1)
N(find(M==R(n,1))) = R(n,2);
end
请注意,在这种情况下,您将N
使用重命名的值创建一个新矩阵。如果你愿意,你不必这样做。