0

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

谢谢。

4

2 回答 2

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

而不是您正在寻找的两个元素(它们是520)。

什么sub2ind是将您拥有的行/列索引转换为线性索引

>> sub2ind( size(M), r, c )
ans =
5 20

这恰好是所请求条目的线性索引。

您可以将线性索引视为访问矩阵中元素所需的单个索引,以防矩阵被转换为一个接一个地堆叠其列的向量。

几点评论:

  1. Matlab 有几种索引矩阵的方法:按行/​​列索引(就像你ij问题一样)。通过线性索引(就像index你的问题一样)。然而,更有效的方法是使用逻辑索引y:也就是说,使用与true您希望设置/获取的条目大小相同的矩阵。
    所以,在你的例子中,如果你能得到这样一个逻辑矩阵而不是or indexij会更好。

  2. Matlab 与其他编程语言相比具有许多优势。其中之一是它能够极其高效地执行向量/矩阵运算。在 Matlab 中应该避免使用循环,或者更糟糕的是,嵌套循环。

  3. 在 Matlab 中使用iandj作为变量不是一个好习惯。

于 2013-02-21T18:04:03.910 回答
1

如果你想找到一个值的出现,y(i,j)只需评估

idx = (pixels == y(i,j));

根据您的变量,您可能会这样做

index(idx) = 1;
于 2013-02-21T18:03:08.650 回答