加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

实现基于Vector类的矩阵加减乘算法

(2007-05-02 13:14:50)
分类: 算法
一、矩阵四则运算算法
1. 加减算法
    定义两个Vector对象,va和vb,用以存储矩阵A和矩阵B的元素。根据以上矩阵加减算法,A与 B的和与差。矩阵C中的元素应为va和vb中对应位置上的元素的和与差。程序中通过Vector类的get(i)方法得向量中i位置处的元素,从而矩阵C 中的元素应表示为:
vca.get(i)±vcb.get(i)采用for循环语句,可以得到C矩阵中的每一个元素,见如下为代码所示。
for(int i=0;i
     int a = va在i位置处的元素;
     int b = vb在i位置处的元素;
     int c = a±b;//得到C矩阵在i位置处的元素值
     显示矩阵c的各元素
}
2. 乘算法
    为了得到矩阵C中某个元素,必须通过A矩阵某行元素与B矩阵某列元素成绩的和表示。为此,在程序中,要实现对A矩阵行元素的控制,也要实现对矩阵B中列元素的控制。为了动态的实现n阶方阵的乘积,还要控制C矩阵某一元素是多少个乘积的和。设用mr表示矩阵的阶,用get(i)方法取得矩阵在某个位置处的数值,以下伪代码表示矩阵C中Cij的值,根据该运算算法,可以得到C矩阵所有元素的值,从而实现两矩阵的乘积。
for(int i=0;i
//设i表示矩阵元素在向量对象中的位置,mr阶矩阵共有mr*mr个元素
 for(int j=0;j
    for(int k=0;k
      a=A矩阵在i行处的索引为k的元素;b=B矩阵在j列索引为mr*k的元素;
      r为矩阵A和B符合条件的位置处元素值的乘积之和;
  }
 }
}
二、具体实现
1、定义文件MatrixCal.java,MatrixCal继承JDialog,实现ActionListener、ItemListener、KeyListener,编写构造方法,按表1定义类的成员变量。还要定义int型的变量cn和mr,才能用以计数,mr 表示矩阵的阶数,二变量初始值均为零。
2、在构造方法中添加如下语句,实现注册监听器之功能。
矩阵加减乘运算器资源列表
 资源类型  资源ID  标签 备注 
 JLabel  jlbmr  选择阶数  
 JLabel  jlba  矩阵A元素  
 JLabel  jlbb  矩阵B元素  
 JLabel  jlbr  运算结果  
 JComboBox  jcmb    矩阵阶数列表
 JTextField  jtfa    矩阵A运算输入文本框
 JTextField  jtfb    矩阵B运算输入文本框
 JTextArea  jtxta    矩阵A元素显示文本区域
 JTextArea  jtxtb    矩阵B元素显示文本区域
 JTextArea  jtxtr    结果矩阵元素显示文本区域
 JButton  jbtnadd  A+B  
 JButton  jbtnsub  A-B  
 JButton  jbtnmul  A*B  

矩阵四则运算示意图

1-1 矩阵四则运算示意图
jcmb.addItemListener(this);//为下拉列表注册监听器
jtfa.addKeyListener(this);//为矩阵A元素文本输入框注册监听
jtfb.addKeyListener(this); //为矩阵B元素文本输入框注册监听器
jbtnadd.addActionListener(this); //实现矩阵相加功能按钮注册监听器
jbtnsub.addActionListener(this); //实现矩阵相减功能按钮注册监听器
jbtnmul.addActionListener(this);//实现矩阵相乘功能按钮注册监听器

3、在主类构造方法中添加以下语句,为下拉列表添加从1到 10的初始值。
for(int i=1;i<11;i++)
    jcmb.addItem(String.valueOf(i));//把1-10添加到列表中表示矩阵阶数

4、为下拉列列表注册监听器,获取输入矩阵阶数并激活文本框、按钮,删除文本域中存在的一切内容,代码如下。
public void itemStateChanged(ItemEvent e) {
    mr = Integer.parseInt((String)jcmb.getSelectedItem
());
    jtxta.setText("");
    jtxtb.setText("");
    jtxtr.setText("");
    va.removeAllElements();
    vb.removeAllElements();
    cn = 0;//cn控制矩阵每行元素在文本域中的显示
    jtfa.setEditable(true);//设置文本域可编辑
    jtfb.setEditable(true); //设置文本域可编辑
    jbtnadd.setEnabled(true);//激活按钮
    jbtnsub.setEnabled(true); //激活按钮
    jbtnmul.setEnabled(true); //激活

       }

5、为矩阵A、B元素文本输入框jtfa和jtfb注册监听器(见前面),实现KeyPressed抽象方法,实现输入矩阵A和B各元素,并分别在文本域jtxta和jtxtb内按矩阵元素行列排列方式显示,代码如下。
public void keyReleased(KeyEvent ke){}
public void keyTyped(KeyEvent ke){}
public void keyPressed(KeyEvent ke){
  if(ke.getKeyCode()==KeyEvent.VK_ENTER){ //按回车键表示一个元素输入完毕
    if(ke.getSource()==jtfa){//如果是在矩阵A文本框中输入元素
   if(!jtfa.getText().equals("")){//输入不为空时在文本域中显示矩阵元素
        va.add(jtfa.getText().trim());//元素保存到Vector对象中以便计算
        jtxta.append((String)jtfa.getText()+" ");//元素显示在文本域

       jtfa.setText("");//文本框清空

        cn = cn+1;//元素计数器自增1
        //mr 表示矩阵阶,如果条件满足,表明矩阵某一行元素已在文本域中
       // 输出完毕,该换行输出矩阵另一行各元素
        if(cn%mr==0) //换行输出
         jtxta.append("\n");
        if(cn==mr*mr){//条件满足时说明该矩阵的元素已经输入完毕
         jtfa.setEditable(false);//设文本框为非编辑状态
         jbtnadd.setEnabled(true);//按钮激活
         jbtnsub.setEnabled(true); //按钮激活
         jbtnmul.setEnabled(true);//按钮激活
         cn = 0;//计数器清零,再次使用
  }
 }
}

else  if(ke.getSource()==jtfb){//在矩阵B文本框中输入元素,算法实现同上
 if(!jtfb.getText().equals("")) {
   vb.add(jtfb.getText().trim());
   jtxtb.append((String)jtfb.
   getText().trim()+" ");
   jtfb.setText("");
   cn = cn+1;
   if(cn%mr==0)//换行输出
     jtxtb.append("\n");
   if(cn==mr*mr){
     jtfb.setEditable(false);
     jbtnadd.setEnabled(true);
   jbtnsub.setEnabled(true);
   jbtnmul.setEnabled(true);
     cn = 0;
    }
   }

  }

}

6、为矩阵加、减、乘三个按钮注册监听器(见前),重载actionPerformed方法,
实现矩阵的四则运算。根据前面算法,代码设计如下:

public void actionPerformed(ActionEvent ae){
  jtxtr.setText("");//结果文本域清空
  if(va.size()==vb.size())//只有两个矩阵的同阶才能运算
    if(ae.getSource()==jbtnadd)
    {// 实现 A + B
    for(int i=0;i
    //获取va中的每个元素的值
       int a = Integer.parseInt(va.get(i).toString());
    //获取vb中的每个元素的值

       int b = Integer.parseInt(vb.get(i).toString());
       int c = a+b;//A与B中同一位置处元素相加
       jtxtr.append(String.valueOf(c)+" ");//把结果显示在文本域中
       cn = cn+1;
       if(cn%mr==0)
        jtxtr.append("\n");//换行输出
       if(cn==mr*mr)
        cn = 0; //矩阵元素输出完毕计数器清零
}
}
else if(ae.getSource()==jbtnsub){// 实现 A - B,
  for(int i=0;i
     int a   =Integer.parseInt(va.get(i).toString());
     int b   =Integer.parseInt(vb.get(i).toString());
     int c = a-b;
     jtxtr.append(String.valueOf(c)+" ");
     cn = cn+1;
     if(cn%mr==0)
      jtxtr.append("\n");
     if(cn==mr*mr)
       cn = 0;
  }
}
else if(ae.getSource()==jbtnmul){// 实现 A*B
  for(int i=0;i
    int a=0,b=0;
    for(int j=0;j
     {//控制矩阵B的列元素
       int r=0;
      for(int k=0;k
      //控制A的行与B的列对应位置元素相乘并取和
         a = Integer.parseInt(va.get(i+k).toString());
         Integer.parseInt(vb.get(mr*k+j).toString());
         r += a*b;//得到c矩阵i行j列的元素值
}
jtxtr.append(String.valueOf(r)+" ");//结果在文本域中显示
cn = cn+1;
if(cn%mr==0)
  jtxtr.append("\n");//换行输出
if(cn==mr*mr)
  cn = 0;
  }
 }
}
else {
JOptionPane jop =new JOptionPane();
jop .showMessageDialog(null,"A ,B 不同阶","系统提示",1);
 }
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有