说我有以下矩阵:
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'功能),任何人都知道怎么做?
答案 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中的循环速度很慢,而矩阵运算速度很快,因此这样的单行程可能会比现在的代码快得多。