在matlab
中,在满足特定标准后,我曾经返回像素本身并将其存储在向量pixels
中,如下所示:
pixels(index) = y(i,j);
现在,我想返回location
那些像素。我应该执行以下操作吗?
pixels(index) = i,j;
编辑
如果我想将这些索引设置为 value 1
,我会执行以下操作,对吗?
for i=1:m
for j=1:n
y(i,j)=1
end
end
谢谢。
在 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 有几种索引矩阵的方法:按行/列索引(就像你i
的j
问题一样)。通过线性索引(就像index
你的问题一样)。然而,更有效的方法是使用逻辑索引y
:也就是说,使用与true
您希望设置/获取的条目大小相同的矩阵。
所以,在你的例子中,如果你能得到这样一个逻辑矩阵而不是or index
,i
它j
会更好。
Matlab 与其他编程语言相比具有许多优势。其中之一是它能够极其高效地执行向量/矩阵运算。在 Matlab 中应该避免使用循环,或者更糟糕的是,嵌套循环。
在 Matlab 中使用i
andj
作为变量不是一个好习惯。
如果你想找到一个值的出现,y(i,j)
只需评估
idx = (pixels == y(i,j));
根据您的变量,您可能会这样做
index(idx) = 1;