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

  • Context: MATLAB 
  • Thread starter Thread starter roldy
  • Start date Start date
  • Tags Tags
    Array Matlab Row
Click For Summary
SUMMARY

This discussion focuses on determining if a row appears more than once in an array in MATLAB, specifically within the context of connecting line segments derived from intersection points of facets. The user has implemented a function that utilizes the ismember function to identify common points between line segments stored in a cell array. The challenge lies in optimizing the code to combine the functionality of two separate while loops into a single efficient loop, enhancing performance while maintaining accuracy in identifying connections between segments.

PREREQUISITES
  • Familiarity with MATLAB programming language
  • Understanding of cell arrays and matrix manipulation in MATLAB
  • Knowledge of the ismember function and its application
  • Basic concepts of geometric intersections and line segments
NEXT STEPS
  • Explore advanced MATLAB techniques for optimizing loops and performance
  • Learn about the isequal function and its applications in array comparisons
  • Investigate MATLAB's built-in functions for handling cell arrays more efficiently
  • Research geometric algorithms for line segment intersection and connectivity
USEFUL FOR

MATLAB programmers, computational geometry enthusiasts, and anyone involved in optimizing algorithms for geometric data processing.

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.
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
7K
  • · Replies 2 ·
Replies
2
Views
2K
Replies
2
Views
3K
Replies
1
Views
3K
  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 1 ·
Replies
1
Views
13K
  • · Replies 41 ·
2
Replies
41
Views
10K