在matlab
中,在满足特定条件后,我曾经返回像素本身并将其存储在向量pixels
中,如下所示:
pixels(index) = y(i,j);
现在,我想返回这些像素的location
。我应该这样做吗?
pixels(index) = i,j;
修改
如果我想将这些索引设置为值1
,我会执行以下操作,对吧?
for i=1:m
for j=1:n
y(i,j)=1
end
end
感谢。
答案 0 :(得分:2)
在Matlab的嵌套循环中非常效率低。
使用sub2ind
可以帮助您更快地完成任务:
y( sub2ind( size(y), i, j ) ) = 1;
sub2ind
sub2ind
的作用是什么?
假设您有一个大小为M
的矩阵[4 6]
:
M = [ 1 5 9 13 17 21
2 6 10 14 18 22
3 7 11 15 19 23
4 8 12 16 20 24 ];
您希望访问两个元素:第一行和第二列的元素,第四行和第五列的另一个元素。
在这种情况下,您拥有要访问的行r = [ 1 4 ]
以及您希望访问的列c = [ 2 5 ]
。但是,如果您尝试访问
>> M( r, c )
这是一个2x2矩阵
ans =
5 17
8 20
而不是您要查找的两个元素(5
和20
)。
sub2ind
做的是将您拥有的行/列索引转换为线性索引
>> sub2ind( size(M), r, c )
ans =
5 20
恰好是所请求条目的线性索引。
在将矩阵转换为一个接一个地堆叠其列的向量的情况下,您可以将线性索引视为访问矩阵中元素所需的单个索引。
Matlab有indexing matrices的几种方式:按行/列索引(如问题中的i
和j
)。通过线性指数(如问题中的index
)。但是,更有效的方法是使用逻辑索引:也就是说,使用与y
相同大小的矩阵和true
用于您希望设置/获取的条目。
因此,在您的示例中,如果您可以获得index
或i
和j
的逻辑矩阵而不是,那就更好了。
与其他编程语言相比,Matlab有许多优点。其中之一是它能够非常有效地执行向量/矩阵运算。在Matlab中应该避免使用循环或更糟糕的嵌套循环。
答案 1 :(得分:1)
如果要查找值y(i,j)
的出现,只需评估
idx = (pixels == y(i,j));
根据您的变量,您可以执行
index(idx) = 1;