1. 编写一个M函数,用于计算两个矩阵的积(两个矩阵作为输入参数,不能使用矩阵乘运算符)。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1. 编写一个M函数,用于计算两个矩阵的积(两个矩阵作为输入参数,不能使用矩阵乘运算符)。相关的知识,希望对你有一定的参考价值。

参考技术A function C=ji(A,B)
[M N]=size(A);
[m n]=size(B);
if N~=m
error('前者列数与后者行数不同,无法相乘!');
else
for p=1:M
for q=1:n
for t=1:N
D(p,q,t)=A(p,t)*B(t,q);
end
C(p,q)=sum(D(p,q,:));
end
end
end本回答被提问者和网友采纳
参考技术B MATLAB概论
MATLAB是世界流行的优秀科技应用软件之一。具有功能强大(数值计算、符号计算、图形生成、文本处理及多种专业工具箱)、界面友好,可二次开发等特点。在国内外,已有许多高等院校将其列为本科生、研究生和博士生必须掌握的基本技能。
1起源与发展
自1984年由美国MathWorks公司推向市场以来,先后发布了多个版本,1993年发布4.0版,1995年发布4.2c版,1996年发布5.0版,1997年发布5.1版,1999年发布5.3版,2000年发布6.0版,目前发布的为6.5版。
2基本组成
MATLAB主要由MATLAB主程序、Simulink动态仿真系统和MATLAB工具箱三大部分组成。其中MATLAB主程序包括MATLAB语言、工作环境、句柄图形、数学函数库和应用程序接口五个部分;Simulink是用于动态系统仿真的交互式系统,允许用户在屏幕上绘制框图来模拟系统并能动态地控制该系统;工具箱则是MATLAB的基本语句编写的各种子程序集和函数库,用于解决某一方面的特定问题或实现某一类的新算法,是开放的,可以根据需要扩充。
3通用命令
通用命令是在MATLAB命令窗口中直接键入并执行。常见的如下表所列。
名称 功能说明
clear 清除内存中所有的或指定的变量和函数
cd 显示和改变当前工作目录
clc 擦除MATLAB工作窗口中所有显示的内容
clf 擦除MATLAB工作窗口中的图形
dir 列出当前或指定目录中的文件清单
disp 在运行中显示变量或文字内容
echo 控制运行的文字命令是否显示
hold 控制当前的图形窗口对象是否被刷新
home 擦除命令窗口中的全部内容
pack 收集内存碎片以扩大内存空间
quit 关闭并退出MATLAB
type 显示所指定文件的全部内容
exit 退出MATLAB
4帮助文件
MATLAB为用户提供了非常详尽的帮助文件,最常见的帮助命令是help,直接输入help则列出全部信息,help后加对象则提示对象帮助信息。
MATLAB的基本矩阵运算
1 简单矩阵输入
MATLAB最基本、也是最重要的功能就是进行实数矩阵或者复数矩阵的运算。由于向量可作为矩阵的一行或者一列,标量(一个数)则可以作为只含有一个元素的矩阵,故向量和标量都可以作为特殊矩阵来处理。MATLAB的操作和命令对于矩阵而言,和我们平时使用的形式很相似,但它还有自己的一些规定。
一、键盘输入
对于比较小的简单矩阵,可以使用键盘直接输入,例如:
a=1;b=2;c=3
x=[5 b c;a*b a+c c/b]
x =
5.0000 2.0000 3.0000
2.0000 4.0000 1.5000
矩阵生成不但可以使用纯数字,也可以使用变量。矩阵的元素直接排列在方括号内,每行内的元素使用空格或者逗号分开,行与行之间使用分号隔开。大的矩阵可以分行输入,用回车键代替分号,这和我们平时使用的矩阵形式很相近。例如
a=[1 2 3
4 5 6]
大部分的试验数据使用上面的形式给出的,在处理试验数据中,可以简单的将数据前后加入左右括号,就可以得到矩阵的表示。这种处理可以在脚本文件中进行。
二、矩阵生成
MATLAB提供了很多生成和操作矩阵的函数。下面给出几个创建矩阵的例子。
如果是线性等间距格式生成矩阵,可以使用from:step:to方式。from、step、to分别表示开始值、步长和结束值。例如
a=1:2:10
a =
1 3 5 7 9
还可以使用linspace命令,如:
a=linspace(1,10,5)
a =
1.0000 3.2500 5.5000 7.7500 10.0000
linespace的三个参数表示开始值、结束值和数据个数。数据个数可以省略,缺省值为100。
在画Bode图等应用中,需要使用对数等间隔的数据,可以使用logspace命令生成。Logspace和linspace的参数相同,只是结果不同。
2 矩阵运算
矩阵运算是MATLAB的基础,MATLAB的矩阵运算功能十分强大,并且运算的形式和一般的数学表示十分相似。
一、矩阵的转置
矩阵的转置用符号 ’
a=[1 2 3;4 5 6]
a =
1 2 3
4 5 6
b=a'
b =
1 4
2 5
3 6
如果矩阵a为复数矩阵,则a’为共轭转置。
a=[1 2;4 5], d=a+a*i,c1=d',c2=conj(d),

求两个大整数相乘的积,数字长度在127个字符之内。

    计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位)。

方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal;

方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平。

此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性。

1、主函数

import java.math.BigDecimal;
import java.util.Scanner;
public class Big_multip {
public static void main(String[] args) {
	Scanner sc=new Scanner(System.in);
	  int i=10;
	  while(i>1){
	  System.out.print("输入第一个数:");
	  String s1=sc.next();
	  System.out.print("输入第二个数:");
	  String s2=sc.next();
	  String s4=send(s1,s2);
	  System.out.println("计算结果是:"+s4);
	  System.out.println("正确结果:   "+ku_big(s1,s2));
	  --i;
	  }
	  sc.close();
};

2、对输入数据的第一步处理,分发处理代码 

public static String send(String s1,String s2){
    if(!(check(s1)&&check(s2)))
     return "输入有非法字符";    
    s1=take_head_zero(s1);
    s2=take_head_zero(s2);
    String str=multiply_first(s1,s2);
    str=take_head_zero(str);
    return str;
};

 

3、处理相乘的第一步

public static String multiply_first(String s1,String s2){
    int len2=s2.length(),a=0;
    String str="0";
    for(int i=0;i<len2;++i)
    {
        a=s2.charAt(len2-1-i)-‘0‘;
        String sa=null;
        if(a!=0)
        {
          sa=multiply_one(s1,a);
         for(int j=0;j<i;++j)
            sa=sa+"0";
         str=integer_add(sa,str);
        }
    }
    return str;
};

4、计算纯数字字符串乘以每个数字(个位数字)的结果

public static String multiply_one(String s,int a){
    int len=s.length(),k=0,before=0,kk=0;
    String str="";
    for(int i=1;i<=len;++i) /*从最低位(即下标最大)处开始算*/
    {
        k=(s.charAt(len-i)-‘0‘)*a+before; 
        before=k/10;
        k=k%10;
        str=k+str;
        kk=1;
    }
    if(kk==0)
        str="0";
    else
     if(before>0)
        str=before+str;
    return str;
};

5、两个纯数字相加代码

public static String integer_add(String s1,String s2){ 
    /*传递的时候已经确定第一个参数s1为最长字符串,s2为短字符串。*/
    if(s1.length()<s2.length())
    {
        String temp=s1;
        s1=s2;
        s2=temp;
    }
    int len1=s1.length(),len2=s2.length();
    int a,temp=0;
    String str="";
    for(int i=1;i<=len1;++i) 
    /*注意开始i=1,结束时i==len1,因为前面i是从1开始,后面结束要多算一位*/
    {
        if(i<=len2)
           a=temp+(s1.charAt(len1-i)-‘0‘)+(s2.charAt(len2-i)-‘0‘);
        else
            a=temp+(s1.charAt(len1-i)-‘0‘);
        temp=a/10;
        a=a%10;
        str=a+str;
    }
    if(temp!=0)
        str=temp+str;
    /*消除最前面的数字0*/
    str=take_head_zero(str);
    return str;
};

6、对于纯数字,剔除前面多余的零

/*剔除前面多余的数字0.*/
public static String take_head_zero(String s){
    int len=s.length(),i=0;
    while(i<len)
    {
        if(s.charAt(i)==‘0‘)
            ++i;
        else
            break;
    }
    if(i<len)
     s=s.substring(i);
    else
        s="0";
    return s;
};

7、检查输入的字符串是否有非法的字符

public static boolean check(String s){
    int k=0;
    for(int i=0;i<s.length();++i)
    {
        if(s.charAt(i)<=‘9‘&&s.charAt(i)>=‘0‘)
        {
            if(s.charAt(i)==‘.‘)
            {    ++k;
              if(k>=2)
                return false;
            }
        }
        else
            return false;
    }
    return true;
};

8、调用库函数就两个长纯数字的积,为了验证自己编写的代码计算结果是否正确。

public static String ku_big(String s1,String s2){
    BigDecimal b1;
    BigDecimal b2;
    BigDecimal b=new BigDecimal("0");
   try{
    b1=new BigDecimal(s1);  
    b2=new BigDecimal(s2);
    b=b1.multiply(b2);
    
    }catch(NumberFormatException e){
        //System.out.println(e);
        return "输入有非法字符";
    }
    return b.toString();
};

999、下面是整个程序的完整代码(此代码仅仅参考,若有bug希望共勉。)

/*两个长数字相乘*/
import java.math.BigDecimal;
import java.util.Scanner;
public class Big_multip {
public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
      int i=10;
      while(i>1){
      System.out.print("输入第一个数:");
      String s1=sc.next();
      System.out.print("输入第二个数:");
      String s2=sc.next();
      String s4=send(s1,s2);
      System.out.println("计算结果是:"+s4);
      System.out.println("正确结果:   "+ku_big(s1,s2));
      --i;
      }
      sc.close();
};
public static String send(String s1,String s2){
    if(!(check(s1)&&check(s2)))
     return "输入有非法字符";    
    s1=take_head_zero(s1);
    s2=take_head_zero(s2);
    String str=multiply_first(s1,s2);
    str=take_head_zero(str);
    return str;
};
public static String multiply_first(String s1,String s2){
    int len2=s2.length(),a=0;
    String str="0";
    for(int i=0;i<len2;++i)
    {
        a=s2.charAt(len2-1-i)-‘0‘;
        String sa=null;
        if(a!=0)
        {
          sa=multiply_one(s1,a);
         for(int j=0;j<i;++j)
            sa=sa+"0";
         str=integer_add(sa,str);
        }
    }
    return str;
};
public static String multiply_one(String s,int a){
    int len=s.length(),k=0,before=0,kk=0;
    String str="";
    for(int i=1;i<=len;++i) /*从最低位(即下标最大)处开始算*/
    {
        k=(s.charAt(len-i)-‘0‘)*a+before; 
        before=k/10;
        k=k%10;
        str=k+str;
        kk=1;
    }
    if(kk==0)
        str="0";
    else
     if(before>0)
        str=before+str;
    return str;
};
public static String integer_add(String s1,String s2){ 
    /*传递的时候已经确定第一个参数s1为最长字符串,s2为短字符串。*/
    if(s1.length()<s2.length())
    {
        String temp=s1;
        s1=s2;
        s2=temp;
    }
    int len1=s1.length(),len2=s2.length();
    int a,temp=0;
    String str="";
    for(int i=1;i<=len1;++i) 
    /*注意开始i=1,结束时i==len1,因为前面i是从1开始,后面结束要多算一位*/
    {
        if(i<=len2)
           a=temp+(s1.charAt(len1-i)-‘0‘)+(s2.charAt(len2-i)-‘0‘);
        else
            a=temp+(s1.charAt(len1-i)-‘0‘);
        temp=a/10;
        a=a%10;
        str=a+str;
    }
    if(temp!=0)
        str=temp+str;
    /*消除最前面的数字0*/
    str=take_head_zero(str);
    return str;
};
/*剔除前面多余的数字0.*/
public static String take_head_zero(String s){
    int len=s.length(),i=0;
    while(i<len)
    {
        if(s.charAt(i)==‘0‘)
            ++i;
        else
            break;
    }
    if(i<len)
     s=s.substring(i);
    else
        s="0";
    return s;
};
public static boolean check(String s){
    int k=0;
    for(int i=0;i<s.length();++i)
    {
        if(s.charAt(i)<=‘9‘&&s.charAt(i)>=‘0‘)
        {
            if(s.charAt(i)==‘.‘)
            {    ++k;
              if(k>=2)
                return false;
            }
        }
        else
            return false;
    }
    return true;
};
public static String ku_big(String s1,String s2){
    BigDecimal b1;
    BigDecimal b2;
    BigDecimal b=new BigDecimal("0");
   try{
    b1=new BigDecimal(s1);  
    b2=new BigDecimal(s2);
    b=b1.multiply(b2);
    
    }catch(NumberFormatException e){
        //System.out.println(e);
        return "输入有非法字符";
    }
    return b.toString();
};

}

 

以上是关于1. 编写一个M函数,用于计算两个矩阵的积(两个矩阵作为输入参数,不能使用矩阵乘运算符)。的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中如何定义一个矩阵。。

题目1489:计算两个矩阵的乘积

求两个大整数相乘的积,数字长度在127个字符之内。

BZOJ2901矩阵求和 临时版

bzoj2901矩阵求和 前缀和

NumPy 点积:取向量积的积(而不是求和)