# This function merges two numeric entities based on their labels.
# If both are vectors, for example, then the result is a vector that
# has as its labels the combination of the two original vectors. Its
# elements come from the corresponding elements in the original
# vectors; if the same label appears in both vectors then the
# corresponding element is the sum of the original two.
# Maybe an example would make this more clear...
# > x = 1, 2, 3;
# > x.eid = "a", "b", "c";
# > y = 4, 5, 6;
# > y.eid = "b", "c", "d";
# > z = merge( x; y );
# > z?
# ( 1, 6, 8, 6 )
# > z.eid?
# ( "a", "b", "c", "d" )
merge = function( a; b ) {
local( c; v1; v2 );
if ( a.class == "matrix" ) {
b = matrix( b );
elseif ( b.class == "matrix" )
a = matrix( a );
elseif ( a.class == "vector" )
b = vector( b );
elseif ( b.class == "vector" )
a = vector( a );
}
if ( a.class == "vector" ) {
if ( a.eid == NULL | b.eid == NULL )
{
message( "run time error: Missing labels." );
exception();
}
v1 = combine( a.eid; b.eid );
c = cram (v1.ne; fill (0; a));
c.eid = v1;
c[ find( a.eid; v1 ) ] = a;
c[ find( b.eid; v1 ) ] += b;
elseif ( a.class == "matrix" )
if ( a.rid == NULL | a.cid == NULL | b.rid == NULL | b.cid == NULL )
{
message( "run time error: Missing labels." );
exception();
}
v1 = combine( a.rid; b.rid );
v2 = combine( a.cid; b.cid );
c = cram (v1.ne, v2.ne; fill (0; a));
c.rid = v1;
c.cid = v2;
c[ find( a.rid; v1 ); find( a.cid; v2 ) ] = a;
c[ find( b.rid; v1 ); find( b.cid; v2 ) ] += b;
else
c = a + b;
}
return c;
};
syntax highlighted by Code2HTML, v. 0.9.1