假设我有以下矩阵:
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‘函数)来做这件事,有人知道怎么做吗?
发布于 2012-03-10 02:51:34
这不是超级通用,但可以做你想做的事情。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所做的工作。
发布于 2012-03-10 02:54:28
你有一个矩阵a
[r,c]=ind2sub(size(a),find(a));
a(find(a))=c;编辑:这是可以在一行中完成的,因为这对你很重要:
[r,a(find(a))]=ind2sub(size(a),find(a));发布于 2012-03-10 03:22:56
您可以使用meshgrid来完成此操作:
[H, W] = size(a);
a = a.*meshgrid(1:H,1:W);https://stackoverflow.com/questions/9639306
复制相似问题