如何将关联数组打印为矩阵

时间:2016-03-21 07:35:56

标签: oracle plsql

我正在创建2个关联数组,其中我将0到30之间的随机值放在其中,之后我想打印为矩阵。我有办法做到吗?

这是我的代码:

set serveroutput on
DECLARE 
    TYPE MyTab IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
    mat1 MyTab;
    mat2 MyTab;
    v_n NUMBER(2);
    v_m NUMBER(2);
    v_nr NUMBER(3);
    v_dim NUMBER(3);
BEGIN
   v_n := round(dbms_random.value(2,5));
   v_m := round(dbms_random.value(2,5));
   v_nr := 1;
   v_dim := v_n*v_m;
   DBMS_OUTPUT.PUT_LINE(v_n||'    '||v_m);
   FOR i in 1 ..v_dim LOOP
       mat1(v_nr) := round(dbms_random.value(0,30));
       v_nr := v_nr+1;
   END LOOP;
   v_nr := 1;
   FOR i in 1 ..v_dim LOOP
       mat2(v_nr) := round(dbms_random.value(0,30));
       v_nr := v_nr+1;
   END LOOP;
   FOR i in 1 ..v_dim LOOP
       DBMS_OUTPUT.PUT_LINE(mat1(i));    
    END LOOP; 
   DBMS_OUTPUT.PUT_LINE(chr(10));
   FOR i in 1 ..v_dim LOOP
       DBMS_OUTPUT.PUT_LINE(mat2(i));    
   END LOOP;
END;
/

2 个答案:

答案 0 :(得分:2)

我刚才了解到有2个矩阵,mat1mat2,它们具有不同的大小(但两者都有相同的尺寸)。 以下是如何显示它们:

set serveroutput on
DECLARE 
    TYPE MyTab IS TABLE OF NUMBER INDEX BY  pls_integer;
    mat1 MyTab;
    mat2 MyTab;
    v_n pls_integer;
    v_m pls_integer;
    v_nr pls_integer;
    v_dim pls_integer;
BEGIN
   v_n := round(dbms_random.value(2,5));
   v_m := round(dbms_random.value(2,5));
   if (v_n > v_m) then
       -- switch values for V_m to be the biggest dim
       v_nr:=v_n;
       v_n:=v_m;
       v_m:=v_nr;
   end if;

   v_nr := 1;
   v_dim := v_n*v_m;
   DBMS_OUTPUT.PUT_LINE(v_n||'    '||v_m);
   FOR i in 1 ..v_dim LOOP
       mat1(v_nr) := round(dbms_random.value(0,30));
       v_nr := v_nr+1;
   END LOOP;
   v_nr := 1;
   FOR i in 1 ..v_dim LOOP
       mat2(v_nr) := round(dbms_random.value(0,30));
       v_nr := v_nr+1;
   END LOOP;

   DBMS_OUTPUT.PUT_LINE('MATRIX1');      
   FOR i in 1 ..v_n LOOP
       FOR j in 1 ..v_m LOOP
           DBMS_OUTPUT.PUT(' - '|| rpad(mat1((j-1)*v_n + i), 4));               
       END LOOP;
       DBMS_OUTPUT.PUT_LINE('');
    END LOOP; 

   DBMS_OUTPUT.PUT_LINE('MATRIX2');      
   FOR i in 1 ..v_n LOOP
       FOR j in 1 ..v_m LOOP
           DBMS_OUTPUT.PUT(' - '|| rpad(mat2((j-1)*v_n + i), 4));               
       END LOOP;
       DBMS_OUTPUT.PUT_LINE('');
    END LOOP; 
END;
/

我将类型更改为pls_integer,看起来更简单。然后请记住,我将矩阵放在可以乘以的良好形式中(在循环中使用v_nv_m,并添加格式以了解发生的情况。

DECLARE 
    TYPE MyTab IS TABLE OF NUMBER INDEX BY  pls_integer;
    mat1 MyTab;
    mat2 MyTab;
    v_n pls_integer;
    v_m pls_integer;
    v_nr pls_integer;
    v_dim pls_integer;
    idx pls_integer;
    idx1 pls_integer;
    idx2 pls_integer;
    v_p number;
BEGIN
   v_n := round(dbms_random.value(2,5));
   v_m := round(dbms_random.value(2,5));
--   v_n := 2; -- formating works better with 2 and 3
--   v_m := 3;
   v_nr := 1;
   v_dim := v_n*v_m;
   DBMS_OUTPUT.PUT_LINE(v_n||'    '||v_m);
   FOR i in 1 ..v_dim LOOP
       mat1(v_nr) := round(dbms_random.value(0,30));
       v_nr := v_nr+1;
   END LOOP;
   v_nr := 1;
   FOR i in 1 ..v_dim LOOP
       mat2(v_nr) := round(dbms_random.value(0,30));
       v_nr := v_nr+1;
   END LOOP;

   DBMS_OUTPUT.PUT_LINE('MATRIX1:a');      
   FOR i in 1 ..v_n LOOP
       DBMS_OUTPUT.PUT('        ..................    ');
       FOR j in 1 ..v_m LOOP
           idx:=(j-1)*v_n + i;
           DBMS_OUTPUT.PUT(' |'||j||','||i||'a['||idx||']'|| rpad(mat1(idx), 4));               
       END LOOP;
       DBMS_OUTPUT.PUT_LINE('');
    END LOOP; 

   DBMS_OUTPUT.PUT_LINE('MATRIX2:b');      
   FOR i in 1 ..v_m LOOP
       FOR j in 1 ..v_n LOOP
           idx:=(j-1)*v_m + i;
           DBMS_OUTPUT.PUT(' |'||j||','||i||'b['||idx||']'|| rpad(mat2(idx), 4));               
       END LOOP;
       DBMS_OUTPUT.PUT_LINE('');
   END LOOP; 

   DBMS_OUTPUT.PUT_LINE('product: a x b');      
   FOR L in 1 ..v_m LOOP
       DBMS_OUTPUT.PUT(' ---------------------------');
       FOR K in 1 ..v_m LOOP
           v_p:=0;
           DBMS_OUTPUT.PUT(' | ');
           FOR j in 1 ..v_n LOOP
               idx1 := j + (K-1)*v_n;
               idx2 := (j-1)*v_m + L;
               v_p := v_p + mat1(idx1) *  mat2(idx2) ;
               DBMS_OUTPUT.PUT('a['||idx1||']b['||idx2||']+');
           END LOOP;
           DBMS_OUTPUT.PUT('->'|| rpad(v_p, 4));               
       END LOOP;
       DBMS_OUTPUT.PUT_LINE('');
    END LOOP; 

END;
/

答案 1 :(得分:2)

您想使用Matrix进行计算还是记录?

使用Matrix进行日志记录非常困难。我不认为这是一个好方法。如果你坚持,这是代码。

FOR i in 1 ..v_n LOOP
   FOR j in 1 ..v_m LOOP
       DBMS_OUTPUT.PUT( mat.at<double>(i,j));