-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'
Cœur
  • 37,241
  • 25
  • 195
  • 267
gurwinder
  • 237
  • 1
  • 5
  • 13
  • You may want to add 4 spaces in front of the code bits of your question. It will make it more readable. – Doresoom Dec 11 '09 at 18:29

1 Answers1

4

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
  • 125,304
  • 15
  • 256
  • 359
  • hats off to you my friend, this is exactly what i want, god bless u, u r genius – gurwinder Dec 12 '09 at 13:44
  • 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 10 index = randi(N,[1 2]); %# Pick two nodes at random – gurwinder Dec 12 '09 at 16:43
  • @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 Dec 12 '09 at 20:04
  • 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 Dec 12 '09 at 20:06
  • @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 Dec 12 '09 at 20:32
  • 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 Dec 12 '09 at 21:01