MATLAB How to determine if a row appears more than once in an array in MATLAB

AI Thread Summary
The project involves reading vertices from a text file and storing them in a matrix representing facets (triangles). The program calculates intersection points of these facets with a plane and stores them in a cell array. A function is used to connect line segments based on common points between rows in this cell array. The current implementation only works when the first row in the intersection array has a single common point with another row. The user seeks a method to identify rows with only one common point, which should yield two rows in the array for the start and end of the line segment. The code provided attempts to achieve this but requires optimization and integration of logic to handle multiple connections more effectively. The user has made progress using the 'ismember' function and is looking to streamline the process by combining separate while loops.
roldy
Messages
206
Reaction score
2
I'm working on a project for myself that I started some time ago. This question only covers a small part of what I am doing. In my program I have vertices that I read in from a text file. They are read and stored in a matrix where each row of the matrix is a facet (triangle) created by the 2 (x,y) vertices. I end up with a N X 3 matrix of vertices where N is the number of facets. I then pass these through a function that determines what the intersection points are for each facet that is intersected by a plane at x = some value. The intersection points are stored in a N X 2 cell array (say B) where each row is a line segment created by the intersection points of each facet. I wrote a function that takes this cell array and "connects" the line segments by finding the common point (cell) of a row to another row. I have this working to a certain extent. The catch is that it only works if the first row in B is a line segment that has only one point in common with one other row. What I want to do is figure out a way to find which row in B has only one point in common with the one other row. There should be 2 rows in B for this (one for the start and one for the end of the line). Below is the code that I have written thus far. A represents the starting line segment to begin the sorting. Right now A is set as the first row in B in order for the program to run. Try changing A to any other row besides an end line segment to understand what I am getting at.

Code:
function [line] = connect(B)
clear all
clc

% Build the example cell arrays
A = {[4,-1],[3,0]};     %Initial test row value
B = {[4,-1],[3,0];     %end line segment      
     [-1,4],[-3,5];     %end line segment
     [3,0],[2,1];
     [2,1],[-1,4]};

ANumVec = cell2mat(A);
ANum = reshape(ANumVec, 2, 2)';
Bmat = cell2mat(B);

line = A;
m = length(Bmat);
count = 2;

while  m ~= 1
     
    I1 = ismember(Bmat(:, 1:2), ANum, 'rows');      %check first two columns
    I2 = ismember(Bmat(:, 3:4), ANum, 'rows');      %check last two columns    
    I = [I1, I2];
    B(all(I == 1,2),:) = {[], []};      %replace start row with empty cells to remove from list for next iteration
    I(all(I == 1,2),:) = 0;             %Find indice of the row in B that contains a matching vertice of the vertices in A
    
    A = Bmat(I > 0,:);                  %Get next test row vertices
    ANum = reshape(A,2,2)';
    line(1,count:count+1) = {A(1,[1 2]), A(1,[3 4])};      %Assemble connectivity array

    empty_row = ~cellfun('isempty',B);
    B = B(empty_row(:,1),:);                %Resize B array by removing empty rows
    Bmat = cell2mat(B);
    [m n] = size(Bmat);

	count = count+1;    
end
 
Physics news on Phys.org
I think the 'isequal' operator might be of some help?

>> A = [1 1 1; 1 1 1;0 0 0;0 0 0]

A =

1 1 1
1 1 1
0 0 0
0 0 0

>> B = [1 1 1]

B =

1 1 1

>> for i=1:size(A,2)
C(i) = isequal(A(i,:),B);
end
>> C

C =

1 1 0 0
 
Thanks for the reply. I actually figure this out last night using a combination of ismember and if/then logic statements. This works, however it is in a separate while loop than the one that does the "connecting". Right now I'm trying to optimize the code and trying to figure out how to combine the two while loops.
 
Back
Top