矩阵单衬里中的Matlab查找替换?

时间:2012-03-09 18:42:24

标签: matlab indexing replace

说我有以下矩阵:

1 0 1 1 0 0
0 0 1 0 1 0
1 1 1 0 0 1
0 1 1 0 0 1
1 1 1 1 1 0

我想将其转换为其他格式,我将每行中的每个1替换为其列索引,因此它将成为以下内容:

1 0 3 4 0 0
0 0 3 0 5 0
1 2 3 0 0 6
0 2 3 0 0 6
1 2 3 4 5 0

我可以用'哑'方式做到:

[H, W] = size(a);
for i = 1:H
    for j = 1:W
        if(a(i, j) == 1) 
            a(i, j) = j;
        end
    end
end

但肯定有一种方法可以用一行(也许使用'find'功能),任何人都知道怎么做?

4 个答案:

答案 0 :(得分:3)

这不是超级一般,但做你想要的。 find将索引返回到一维版本的数据中,因此我们需要做一些算术来获得两维版本:

a(a == 1) = floor((find(a == 1) - 1) / size(a, 1)) + 1

如果您想改为行索引,可以使用

a(a == 1) = mod(find(a == 1) - 1, size(a, 1)) + 1

如果您使用大矩阵执行此操作,则可能需要先将find(a == 1)分配给临时变量:

inds = find(a == 1)
a(inds) = floor((inds - 1) / size(a, 1)) + 1

(请注意,使用索引列表或布尔矩阵索引到a的工作原理相同。)

如果你知道原始矩阵只有0和1,你也可以使用find(a)

请注意,这只是基本上手动执行@tmpearce's answer所做的事情。

答案 1 :(得分:3)

你有一个矩阵a

[r,c]=ind2sub(size(a),find(a));
a(find(a))=c;

编辑:这在一行中是可行的,因为这对你很重要:

[r,a(find(a))]=ind2sub(size(a),find(a));

答案 2 :(得分:2)

您可以使用meshgrid执行此操作:

[H, W] = size(a);
a = a.*meshgrid(1:H,1:W);

答案 3 :(得分:0)

自从我使用matlab已经有很长一段时间了,所以我无法向你提供代码。但这是我的方式:

创建一个向量1:colums,使用repmat为每一行重复一次,然后将此元素与原始矩阵相乘。

此外,由于matlab中的循环速度很慢,而矩阵运算速度很快,因此这样的单行程可能会比现在的代码快得多。