首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab Find-Replace in Matrix Single Liner?

Matlab Find-Replace in Matrix Single Liner?
EN

Stack Overflow用户
提问于 2012-03-10 02:42:24
回答 4查看 864关注 0票数 1

假设我有以下矩阵:

代码语言:javascript
复制
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替换为其列索引,因此它将变为以下格式:

代码语言:javascript
复制
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

我可以用“愚蠢”的方式来做:

代码语言:javascript
复制
[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‘函数)来做这件事,有人知道怎么做吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-10 02:51:34

这不是超级通用,但可以做你想做的事情。find将索引返回到数据的一维版本中,因此我们需要做一些运算来获得二维版本:

代码语言:javascript
复制
a(a == 1) = floor((find(a == 1) - 1) / size(a, 1)) + 1

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

代码语言:javascript
复制
a(a == 1) = mod(find(a == 1) - 1, size(a, 1)) + 1

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

代码语言:javascript
复制
inds = find(a == 1)
a(inds) = floor((inds - 1) / size(a, 1)) + 1

(请注意,使用索引列表或布尔矩阵对a进行索引的效果是相同的。)

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-03-10 02:54:28

你有一个矩阵a

代码语言:javascript
复制
[r,c]=ind2sub(size(a),find(a));
a(find(a))=c;

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

代码语言:javascript
复制
[r,a(find(a))]=ind2sub(size(a),find(a));
票数 3
EN

Stack Overflow用户

发布于 2012-03-10 03:22:56

您可以使用meshgrid来完成此操作:

代码语言:javascript
复制
[H, W] = size(a);
a = a.*meshgrid(1:H,1:W);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9639306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档