arraysmatlabmatlab-struct

How do I organize this data into structures in MATLAB?


Say for n=5, the following code gives me a plot for n randomly generated nodes. These nodes are not structures (just plotted points), but I want to assign every node a message just as I did for sink and source and keep track of the nodes identity and location.

For example, if node 4 has (x,y) coordinates (.3452 , .5463), I want to assign node 4 a msg and temp_value as well. How can I do this?

Code:

n = input('No. of Nodes:');

sink = [0 0];
source = [1 1];

node = rand(n,2)
x = node(:,1);
y = node(:,2);

x1 = sink(:,1);
y1 = sink(:,1);

x2 = source(:,1);    
y2 = source(:,1);

plot(x,y,'o')
hold on

plot(x1,y1,'r*')
hold on

plot(x2,y2,'r*')
hold on

sink = struct;    
sink.msg = 'temp';
sink.temp_value = '30'

source = struct;
source.msg = 'temp';
source.temp_value = '30'

Solution

  • I would suggest creating an array of structures that stores all of the data associated with each "node". You can create all of the data for your nodes with one call to STRUCT in the following way:

    N = 5;                         %# Number of nodes
    coords = num2cell(rand(N,2));  %# Cell array of random x and y coordinates
    nodes = struct('x',coords(:,1),...   %# Assign x coordinates
                   'y',coords(:,2),...   %# Assign y coordinates
                   'message','temp',...  %# Assign default message
                   'value',30);          %# Assign default value
    

    The variable nodes is an N-by-1 structure array with fields x, y, message, and value. You can access and modify the data using the usual array and field indexing:

    >> nodes(1)  %# Contents of node 1
    
    ans = 
    
              x: 0.4387
              y: 0.4898
        message: 'temp'
          value: 30
    
    >> nodes(1).message  %# Message for node 1
    
    ans =
    
    temp
    
    >> nodes(1).message = 'hello world!';  %# Change message for node 1
    

    You can then plot the nodes in the following way:

    plot([nodes.x],[nodes.y],'r*');                %# Plot all the nodes in red
    index = randi(N,[1 2]);                        %# Pick two nodes at random
    hold on;
    plot([nodes(index).x],[nodes(index).y],'b*');  %# Plot 2 random nodes in blue