[BACK]Return to generic_matrices.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Matrices

Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Matrices/generic_matrices.adb, Revision 1.1

1.1     ! maekawa     1: with unchecked_deallocation;
        !             2:
        !             3: package body Generic_Matrices is
        !             4:
        !             5: -- COMPARISON AND COPYING :
        !             6:
        !             7:   function Equal ( a,b : Matrix ) return boolean is
        !             8:   begin
        !             9:     for i in a'range(1) loop
        !            10:       for j in a'range(2) loop
        !            11:         if not Equal(a(i,j),b(i,j))
        !            12:          then return false;
        !            13:         end if;
        !            14:       end loop;
        !            15:     end loop;
        !            16:     return true;
        !            17:   exception
        !            18:     when CONSTRAINT_ERROR => return false;
        !            19:   end Equal;
        !            20:
        !            21:   procedure Copy ( a : in Matrix; b : in out Matrix ) is
        !            22:   begin
        !            23:     for i in a'range(1) loop
        !            24:       for j in a'range(2) loop
        !            25:         Copy(a(i,j),b(i,j));
        !            26:       end loop;
        !            27:     end loop;
        !            28:   end Copy;
        !            29:
        !            30: -- MATRIX-MATRIX OPERATIONS :
        !            31:
        !            32:   function "+" ( a,b : Matrix ) return Matrix is
        !            33:
        !            34:     res : Matrix(a'range(1),a'range(2));
        !            35:
        !            36:   begin
        !            37:     for i in res'range(1) loop
        !            38:       for j in res'range(2) loop
        !            39:         res(i,j) := a(i,j) + b(i,j);
        !            40:       end loop;
        !            41:     end loop;
        !            42:     return res;
        !            43:   end "+";
        !            44:
        !            45:   function "-" ( a,b : Matrix ) return Matrix is
        !            46:
        !            47:     res : Matrix(a'range(1),a'range(2));
        !            48:
        !            49:   begin
        !            50:     for i in res'range(1) loop
        !            51:       for j in res'range(2) loop
        !            52:         res(i,j) := a(i,j) - b(i,j);
        !            53:       end loop;
        !            54:     end loop;
        !            55:     return res;
        !            56:   end "-";
        !            57:
        !            58:   function "+" ( a : Matrix ) return Matrix is
        !            59:
        !            60:     res : Matrix(a'range(1),a'range(2));
        !            61:
        !            62:   begin
        !            63:     for i in res'range(1) loop
        !            64:       for j in res'range(2) loop
        !            65:         res(i,j) := +a(i,j);
        !            66:       end loop;
        !            67:     end loop;
        !            68:     return res;
        !            69:   end "+";
        !            70:
        !            71:   function "-" ( a : Matrix ) return Matrix is
        !            72:
        !            73:     res : Matrix(a'range(1),a'range(2));
        !            74:
        !            75:   begin
        !            76:     for i in res'range(1) loop
        !            77:       for j in res'range(2) loop
        !            78:         res(i,j) := -a(i,j);
        !            79:       end loop;
        !            80:     end loop;
        !            81:     return res;
        !            82:   end "-";
        !            83:
        !            84:   function "*" ( a,b : Matrix ) return Matrix is
        !            85:
        !            86:     res : Matrix(a'range(1),b'range(2));
        !            87:     acc : number;
        !            88:
        !            89:   begin
        !            90:     for i in res'range(1) loop
        !            91:       for j in res'range(2) loop
        !            92:         Copy(a(i,a'first(2))*b(b'first(1),j),res(i,j));
        !            93:         for k in a'first(2)+1..a'last(2) loop
        !            94:           acc := a(i,k)*b(k,j);
        !            95:           Add(res(i,j),acc);
        !            96:           Clear(acc);
        !            97:         end loop;
        !            98:       end loop;
        !            99:     end loop;
        !           100:     return res;
        !           101:   end "*";
        !           102:
        !           103:   procedure Mul1 ( a : in out Matrix; b : in Matrix ) is
        !           104:
        !           105:     temp : Vector(a'range(2));
        !           106:     acc : number;
        !           107:
        !           108:   begin
        !           109:     for i in a'range(1) loop
        !           110:       for j in b'range(2) loop
        !           111:         Copy(a(i,a'first(2))*b(b'first(1),j),temp(j));
        !           112:         for k in a'first(2)+1..a'last(2) loop
        !           113:           acc :=  a(i,k)*b(k,j);
        !           114:           Add(temp(j),acc);
        !           115:           Clear(acc);
        !           116:         end loop;
        !           117:       end loop;
        !           118:       for j in a'range(2) loop
        !           119:         Copy(temp(j),a(i,j));
        !           120:       end loop;
        !           121:     end loop;
        !           122:   end Mul1;
        !           123:
        !           124:   procedure Mul2 ( a : in Matrix; b : in out Matrix ) is
        !           125:
        !           126:     temp : Vector(a'range(1));
        !           127:     acc : number;
        !           128:
        !           129:   begin
        !           130:     for i in b'range(2) loop
        !           131:       for j in a'range(1) loop
        !           132:         Copy(a(j,a'first(1))*b(a'first(1),i),temp(j));
        !           133:         for k in a'first(1)+1..a'last(1) loop
        !           134:           acc := a(j,k)*b(k,i);
        !           135:           Add(temp(j),acc);
        !           136:           Clear(acc);
        !           137:         end loop;
        !           138:       end loop;
        !           139:       for j in b'range(1) loop
        !           140:         Copy(temp(j),b(j,i));
        !           141:       end loop;
        !           142:     end loop;
        !           143:   end Mul2;
        !           144:
        !           145: -- MATRIX-VECTOR OPERATIONS :
        !           146:
        !           147:   function "*" ( a : Matrix; v : Vector ) return Vector is
        !           148:
        !           149:     res : Vector(a'range(1));
        !           150:     acc : number;
        !           151:
        !           152:   begin
        !           153:     for i in res'range loop
        !           154:       Copy(a(i,a'first(2))*v(v'first),res(i));
        !           155:       for j in a'first(2)+1..a'last(2) loop
        !           156:         acc := a(i,j)*v(j);
        !           157:         Add(res(i),acc);
        !           158:         Clear(acc);
        !           159:       end loop;
        !           160:     end loop;
        !           161:     return res;
        !           162:   end "*";
        !           163:
        !           164:   function "*" ( v : Vector; a : Matrix ) return Vector is
        !           165:
        !           166:     res : Vector(a'range(2));
        !           167:     acc : number;
        !           168:
        !           169:   begin
        !           170:     for j in res'range loop
        !           171:       Copy(v(v'first)*a(a'first(1),j),res(j));
        !           172:       for i in a'first(1)+1..a'last(1) loop
        !           173:         acc := v(i)*a(i,j);
        !           174:         Add(res(j),acc);
        !           175:         Clear(acc);
        !           176:       end loop;
        !           177:     end loop;
        !           178:     return res;
        !           179:   end "*";
        !           180:
        !           181:   procedure Mul ( a : in Matrix; v : in out Vector ) is
        !           182:
        !           183:     tv : Vector(v'range);
        !           184:     acc : number;
        !           185:
        !           186:   begin
        !           187:     for i in v'range loop
        !           188:       Copy(a(i,a'first(2))*v(v'first),tv(i));
        !           189:       for j in a'first(2)+1..a'last(2) loop
        !           190:         acc := a(i,j)*v(j);
        !           191:         Add(tv(i),a(i,j)*v(j));
        !           192:         Clear(acc);
        !           193:       end loop;
        !           194:     end loop;
        !           195:     for i in v'range loop
        !           196:       v(i) := tv(i);
        !           197:     end loop;
        !           198:   end Mul;
        !           199:
        !           200:   procedure Mul ( v : in out Vector; a : in Matrix ) is
        !           201:
        !           202:     tv : Vector(v'range);
        !           203:     acc : number;
        !           204:
        !           205:   begin
        !           206:     for j in v'range loop
        !           207:       Copy(v(v'first)*a(a'first(1),j),tv(j));
        !           208:       for i in a'first(1)+1..a'last(1) loop
        !           209:         acc := v(j)*a(i,j);
        !           210:         Add(tv(j),acc);
        !           211:         Clear(acc);
        !           212:       end loop;
        !           213:     end loop;
        !           214:     for i in v'range loop
        !           215:       v(i) := tv(i);
        !           216:     end loop;
        !           217:   end Mul;
        !           218:
        !           219: -- DESTRUCTORS :
        !           220:
        !           221:   procedure Clear ( a : in out Matrix ) is
        !           222:   begin
        !           223:     for i in a'range(1) loop
        !           224:       for j in a'range(2) loop
        !           225:         Clear(a(i,j));
        !           226:       end loop;
        !           227:     end loop;
        !           228:   end Clear;
        !           229:
        !           230:   procedure Clear ( a : in out Link_to_Matrix ) is
        !           231:
        !           232:     procedure free is new unchecked_deallocation(Matrix,Link_to_Matrix);
        !           233:
        !           234:   begin
        !           235:     if a /= null
        !           236:      then Clear(a.all);
        !           237:     end if;
        !           238:     free(a);
        !           239:   end Clear;
        !           240:
        !           241: end Generic_Matrices;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>