在矩阵中替换所有数字

3
有两个矩阵,第一个是我的输入矩阵: enter image description here 第二个矩阵(“重命名矩阵”)用于替换第一个矩阵的值: enter image description here 也就是说,查看重命名矩阵;必须将701替换为1,717必须替换为10等,以使输入矩阵变为以下形式: enter image description here ? 值已定义但未放置。输入矩阵的第二列已排序(从上到下升序),但值不连续(没有“710”:请参见第一张图片)。
问题是如何从前两个矩阵得到输出矩阵(最后一张图片)。

也许你可以使用这个:containers.Map - DavidK
3个回答

2

看起来这个问题需要使用稀疏矩阵解决。在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));

几乎像魔法一样。

今晚我没有机会检查这个 - 但如果它不能完全按照描述的方式工作,那么它应该非常接近...


它无法工作,IM是<36x2>,LUM是<37X2>,导致出现“索引超出矩阵维度”的错误。 - K. Rmth
错误提示表明IM中存在一个值,该值在LUM的第一列中不存在。您能否打印max(IM(:))max(LUM(1.:))?它们应该是相同的吗? - Floris
max(IM(:)) 和 max(LUM(1,:)) 是相同的,且均等于 799。我不小心交换了上图中 LUM 的列,但是你的方法非常有效,尽管“newMatrix”需要重新调整形状;正如你所说,几乎像魔术一样! - K. Rmth
太好了。我添加了reshape语句 - 请确认现在是否与所提问的问题相匹配... - Floris
1
这是一个非常优雅的解决方案,然而有一个潜在的漏洞,这取决于问题被如何精确陈述。这个漏洞是,如果一个值没有被替换,那么它将在你的解决方案中被设置为0。例如,如果我们想把701改成1,但是想让799保持不变,{701 799}会被替换为{1 0}而不是{1 799} - Phonon
1
@Phonon - 感谢您指出这一点。您是正确的:我做了一个隐含的假设,即输入矩阵中的所有值都有对应的查找矩阵中的值。这可以得到解决。例如,如果在查找矩阵中没有指向零的元素,则在替换后可以测试零,并将事物恢复到原来的状态...但我认为这不是OP所要求的,所以我没有考虑它。 - Floris

1
如果第一列中的值都出现在第二列中,并且您只想用1..n替换第二列中的值并相应地更改第一列中的值,则可以通过简单调用ismember来完成所有这些操作。
%# define "inputMatrix" here as the first array in your post

[~,newFirstColumn] = ismember(inputMatrix(:,1),inputMatrix(:,2));

创建输出,您需要编写以下代码:

To create your output, you'd then write

outputMatrix = [newFirstColumn,(1:length(newFirstColumn))'];

1
如果M是原始矩阵,R是重命名矩阵,下面是操作步骤。
N = M;

for n = 1:size(M,1)
    N(find(M==R(n,1))) = R(n,2);
end

请注意,在这种情况下,您正在创建一个新的矩阵N,其中包含已重命名的值。如果您喜欢,您不必这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接