在matlab中的列和行上使用find函数

时间:2010-02-26 16:05:07

标签: matlab indexing

我在MATLAB中遇到一些find函数的问题。我有一个由零和1组成的矩阵(表示结构元素的几何),其中当矩阵元素= 1时存在材料,并且当矩阵元素= 0时不存在材料。矩阵可以具有一般形式如下所示(它会随着几何图形的改变而更新,但这并不太重要)。

                 Geometry = [0 0 0 0 0 0 0 0 0 0;
                             0 0 1 0 1 0 1 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 0 0 0;
                             0 0 0 0 0 0 0 1 0 0;
                             0 0 0 0 0 0 0 0 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 1 1 1 0 1 0 0;
                             0 0 0 0 0 0 0 0 0 0;]

我正在尝试找到没有连续连接的行和列(即行和列的外部范围之间的行和列都不等于1)然后更新它们以便它们都是连接的。即上面的矩阵成为:

                Geometry =  [0 0 0 0 0 0 0 0 0 0;
                             0 0 1 1 1 1 1 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 1 1 1 1 1 0 0;
                             0 0 0 0 0 0 0 0 0 0;]

我遇到的问题是我希望能够在每一行(和列)中找到第一个和最后一个元素的索引,这些索引将用于更新地理位置矩阵。

理想情况下,我想在向量中表示这些,因此遍历列,找到第一个元素的行号等于1并将其存储在名为rowfirst的向量中。

即:

                    rowfirst = zeros(1,numcols)
                    for i = 1:numcols % Going across the columns
                    rowfirst(i) = find(Geometry(i,1) == 1, 1,'first') 
                                       % Store values in vector called rowfirst
                    end

并为列重复此操作并查找每行中的最后一个元素。

出于某种原因,我无法将值存储在矢量中,是否有人知道我哪里出错?

提前致谢。如果不清楚,请告诉我,因为我可能没有很好地解释这个问题。

4 个答案:

答案 0 :(得分:2)

0)bwmorph(Geometry,'close')将它全部放在一行中。如果洞可能更大,请尝试bwmorph(Geometry,'close',Inf)

关于你的尝试:

1)它应该是Geometry(i,:)而不是Geometry(i,1)

2)这里你真正的问题是空矩阵。实际上,如果第i行没有1,你想要rowfirst(i)是什么?

答案 1 :(得分:1)

我非常确定有一种更有效的方法可以做到这一点,但是如果你用这个替换你的调用,它应该可以正常工作:

find(Geometry(i,:), 1,'first') 

(否则你只是看第i行的第一个单元格。== 1是无用的,因为find只返回非零元素,而你的矩阵是二进制的)

答案 2 :(得分:1)

好的,我可以发现两个错误:

  • 您应该使用数组作为find的第一个参数。因此,如果您想查找每个的第一个元素的行号,那么您应该使用find(Geometry(:, i), 1, 'first')

  • 如果列仅包含零,则
  • Find返回一个空数组。您应该处理这种情况并确定要放入rownumber的数字(例如,您可以输入-1,表示相应的列不包含非零元素)。

按照上述步骤,你可以试试这个:

for i = 1:numcols
  tmp = find(Geometry(:, i), 1, 'first');
  if(tmp)
    rowfirst(i) = tmp;
  else
    rowfirst(i) = -1;
  end;
end;

答案 3 :(得分:1)

使用AccumArray()函数查找最小和最大col(行)编号。

想象一下,在每列中找到包含NaN的最后一行(

a = [1 nan nan nan ;
     2 2   3   4;
     3 nan 3   3;
     4 nan 4   4]

此代码获取每列中最后一个NaN的行索引。

[row,col] = find(isnan(a))
accumarray(col,row,[],@max)

此代码获取每列中第一个NaN的行索引。

[row,col] = find(isnan(a))
accumarray(col,row,[],@min)

交换行和列变量以逐行扫描而不是按列扫描。

这个答案受到Finding value and index of min value in a matrix, grouped by column values

的启发