一、矩阵四则运算算法
定义两个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());
b
= 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);
}
}
加载中,请稍候......