首页 > 编程语言 >【c++】以函数调用的方式来书写矩阵乘法

【c++】以函数调用的方式来书写矩阵乘法

时间:2023-01-15 22:45:28浏览次数:43  
标签:21 temp int double c++ ++ 函数调用 res 乘法

一、第一版

/*m:A的行
* o:A的列,B的行
* n:B的列
* res:存储最终的结果
 */
void multi(double A0[21][21], double B0[21][21], int m, int o, int n, double res[21][21]) {
    double A[21][21];
    double B[21][21];
    double temp;
//防止对原矩阵进行修改
    for (int i = 0;i < 21;i++) {
        for (int j = 0;j < 21;j++) {
            A[i][j] = A0[i][j];
        }
    }
    for (int i = 0;i < 21;i++) {
        for (int j = 0;j < 21;j++) {
            B[i][j] = B0[i][j];
        }
    }
    for (int i = 0;i < m + 1;i++) {
        for (int j = 0;j < n + 1;j++) {
            temp = 0;
            for (int k = 0;k < o + 1;k++) {
                temp += A[i][k] * B[k][j];
            }
            res[i][j] = temp;
        }
    }
}

可以进一步修改:

point 1:创建二维数组

在平时创建二维数组时,不能省略列,但可以省略行,但是在矩阵乘法中,行和列的信息都要有。

 

point 2:二维数组传参

数组的数组名表示数组首元素的地址。二维数组的数组名表示数组第一行的地址。二维数组的首元素为数组第一行。

void test(double* arr) { //错误写法。

}

void test(double** arr) { //错误写法。二级指针用来存放一级指针的地址,而不是数组第一行的地址

}

void test(double* arr[2]) { //错误写法

}

void test(double (*arr)[2]) {//正确写法

}

point 3:矩阵乘法

矩阵乘法只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义。这一部分可以将输入改为两个矩阵的行和列,然后使用assert进行检验。

point 4:对于数组函数参数,指针语法*优先于数组语法[]

对之前的矩阵乘法代码进行改良,得到下列代码:

#include <iostream>
#include <assert.h>

constexpr int row{ 2 };
constexpr int col{ 2 };


void multi(double (* A0)[col], double (* B0)[col], int row1, int col1, int row2, int col2, double (* res)[col]) {
    assert(col1 == row2);
    double temp;
    for (int i = 0;i < row1 + 1;i++) {
        for (int j = 0;j < col2 + 1;j++) {
            temp = 0;
            for (int k = 0;k < col1 + 1;k++) {
                temp += *((*A0 + i) + k) * *((*B0 + k) + j);
                //temp += A0[i][k] * B0[k][j];
            }
            res[i][j] = temp;
        }
    }
}

 

point 5 std::vector

可以使用std::vector 创建二维数组。std::vector可以直接初始化,且可以初始化为非零元素。并且vector一般不用进行显式的释放;

using vec = std::vector<std::vector<int>>;

vec Multi2(vec &A, vec &B) {
    int row1 = A.size() ;
    int col1 = A[0].size() ;
    int row2 = B.size() ;
    int col2 =  B[0].size() ;
    vec res(row1, std::vector<int> (col2,0));
    double temp;
    assert(col1 == row2);
    for (int i = 0;i != row1;++i) {
        for (int j = 0;j != col1;++j) {
            temp = 0;
            for (int k = 0;k != col2;++k) {
                temp += A[i][k] + B[k][j];
            }
            res[i][j] = temp;
        }
    }
    return res;
}

相应的main函数:

int main() {
    int row1{ 2 };
    int col1{ 2 };
    int row2{ 2 };
    int col2{ 2 };
    vec A(row1, std::vector(col1, 0));
    A = { {1, 1}, { 2,2 } };
    vec B(row2, std::vector(col2, 0));
    vec res(row1, std::vector(col2, 0));
    B = { {2, 2}, { 1,1 } };
    res = Multi2(A, B);
}

 

标签:21,temp,int,double,c++,++,函数调用,res,乘法
From: https://www.cnblogs.com/zhimingyiji/p/17054391.html

相关文章

  • 【C++高级编程】(五)编码风格
                                                         ......
  • C++中string占用内存大小
    转自:https://blog.csdn.net/DLUTBruceZhang/article/details/98222351.例子intmain(){strings="abc";cout<<sizeof(s)<<"\n";cout<<sizeof(string)<<"......
  • effective modern c++ - 1 理解模板类别推导
    模板中的行参类型推断会省略引用在这两种模板中,行参的引用都会在推断过程中被省略template<typenameT>//templateAvoidf(T&param);template<typenameT>//temp......
  • P8723 [蓝桥杯 2020 省 AB3] 乘法表
    题目描述九九乘法表是学习乘法时必须要掌握的。在不同进制数下,需要不同的乘法表。例如,四进制下的乘法表如下所示:1*1=12*1=22*2=103*1=33*2=123*3=21请注意,乘......
  • C++追加单个字符
    在C++中如何在字符串的后面追加单个的字符呢?代码如下:stringstr;for(chari='A';i<='Z';i++){str+=i;}cout<<str<<endl<<endl;------------------------------......
  • C++获取输入的空格
    在控制台输入输出中,有时候我们想获取用户输入的空格,该如何做呢?在C++中通常的获取输入的方法如下:#include"stdafx.h"#include<iostream>#include<string>usingnamespaces......
  • 大数乘法
    有这样一道题:对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?......
  • c++求绝对值
    ---------------------------------------------------------------------------------------C语言中求绝对值的函数为abs(),在C++中对函数abs()进行了重载,这样方便了我们的......
  • c++设置控制台输出的行数和列数
    ----------------------------------------------------------------------------------有时候因为要输出的内容很多,控制台一页显示不完,这时我们可以通过设置控制台输出的行......
  • C++相关总结
    在学习C++的时候,最初是在VS上输出HELLOWORLD,然后开始了C++学习之路,然后开始在b站等一些地方看相关视频,在过了一遍基础之后开始学习C++Primer.C++Primer这本书很厚,在看的......