我在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
并为列重复此操作并查找每行中的最后一个元素。
出于某种原因,我无法将值存储在矢量中,是否有人知道我哪里出错?
提前致谢。如果不清楚,请告诉我,因为我可能没有很好地解释这个问题。
答案 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
的启发