views:

273

answers:

1

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'
+3  A: 

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
gnovice
hats off to you my friend, this is exactly what i want, god bless u, u r genius
gurwinder
while running this code, it gives me following error, could you please check it my friend???? Undefined function or method 'randi' for input arguments of type 'double'.Error in ==> directeddiffusion at 10index = randi(N,[1 2]); %# Pick two nodes at random
gurwinder
@gnovice : i tried using rand instead of randi, but it doesn't work. please have a look and tell me how to do, thanks
gurwinder
The function RANDI is only present in newer versions of MATLAB. I discuss another option to use in this answer to one of your other questions: http://stackoverflow.com/questions/1816097/how-would-i-randomly-pick-one-point-from-n-points-in-matlab/1816333#1816333
gnovice
@gnovice : as you told index= randi(N,[1 2]); will pick two nodes at random , but if i use index = ceil(rand*N); it picks only one node. but ,my code requirement is two nodes and what are those nodes.
gurwinder
I answered that in another one of your questions: http://stackoverflow.com/questions/1856141/how-do-i-randomly-select-k-points-from-n-points-in-matlab/1856201#1856201
gnovice