求N阶矩阵的幂(一维,二维多种方法)

news2024/11/18 15:48:55

引用:对于矩阵的计算想必都是一件很头疼的事情吧,因为计算量是比较大,因为你要用前一个矩阵的行乘以后矩阵的列且对应相加才得到新矩阵的第一个元素,且两个矩阵可以相乘的条件也是前一个矩阵的列等于后一个矩阵的行,操作步骤如下.

 那么对于n阶矩阵的幂就是要求你去让两个相同的矩阵再次重新相乘,其实效果是相同的,这个也涉及到了数据结构中的图的的求法,下面展开讲述

方法一

采用一维数组函数的调用的思想

  1. 首先肯定要n阶矩阵输入在呢=内,n则是由你去限定,然后就去输入你的矩阵的数吧
  2. 然后转换到了malloc函数去分配一个新的内存,干嘛呢?将我的数据都存在一维数组
  3. 没错是一维数组将这些数据粗存在一维数组中,具体就是这样的分配的

然后开始处理 那么我是arrTemp函数肯定是要得到初始的数值啊,然后我继续到核心部分

 这个是三重循环但是你存储在数组的数值确实在二维的数组内你的arr,但是那个k是干嘛的呢,在第三重循环k中所起到的作用就是我们最为麻烦的事,前一个矩阵的行乘以后一个矩阵的列然后进行相乘相加传递给sum,这也的确是一个数值,然后就顺理成章的传递给了arr反正人家也是一维数组,当然了,当在循环的时候,你的arr的数值是传递给你的arrtemp就是乘积后的数值,我在输入的时候定义了全局数组。单独存储开始的矩阵,因为后续所要乘的就是那个sove他是没有变的,所以一直使用但是整个过程中不改变他的值,全部代码再下边可以自行分析,有疑问欢迎提问

#include <iostream> 
using namespace std;
void in(int* arr, int n);                       //输入函数,输入一个n阶矩阵的值
int* ExponentiationForTwo(int* arr, int n);    //求二次幂函数;传入矩阵数组,矩阵的阶数,求的幂次;返回一个矩阵数组
void out(int* arr, int n);   //输出函数;输出一个n阶矩阵
int sove[1000];
int main()
{
    cout << "请输入矩形的阶数:";
    //输入矩阵阶数n
    int n;
    cin >> n;

    //为矩阵数组分配内存,分配n*n个int类型大小的空间给arr即矩阵元素个数
    int* arr = (int*)malloc(sizeof(int) * n * n);

    //输入矩阵各个元素的值
    in(arr, n);

    //算出arr的二次幂
    arr = ExponentiationForTwo(arr, n);
    //输出矩阵各个元素的值,这个时候arr是二次的
    cout << "输出二阶幂:\n";
    out(arr, n);
    //算出arr的二次幂,因为上面已经算过一次了,所以这个地方算的是三次幂了
    arr = ExponentiationForTwo(arr, n);
    //输出矩阵各个元素的值,这个时候arr是三次的
    cout << "输出"<<n<<"阶幂:\n";
    out(arr, n);

    //所以如果要求n次幂,只需要循环调用   arr= ExponentiationForTwo(arr, n);这句话就行了,类似于i=i*i;

    return 0;
}
void in(int* arr, int n)
{
    cout << "输入" << n << "行" << n << "列的数据值:\n";
    //二维数组数据的输入
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> arr[i * n + j];
            sove[i * n + j] = arr[i * n + j];
        }
    }
}

int* ExponentiationForTwo(int* arr, int n)
{
    int* tempArr1 = (int*)malloc(sizeof(int) * n * n);


    //把arr的值拷贝到tempArr中
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            tempArr1[i * n + j] = arr[i * n + j];
        }
    }
    //计算tempArr的二次幂,将结果存入到arr中
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            int sum = 0;
            for (int k = 0; k < n; k++)
            {
                sum += tempArr1[i * n + k] * sove[k * n + j];
            }
            arr[i * n + j] = sum;
        }
    }
    //这个时候,原矩阵arr的值已经是arr*arr了,记得要将tempArr申请的内存释放
    free(tempArr1);
    
    return arr;
}
void out(int* arr, int n)
{
    for (int i = 0; i < n; i++) { //二维数组数据的输入
        for (int j = 0; j < n; j++) {
            cout << arr[i * n + j] << " ";
        }
        printf("\n");
    }

}

第二种方法

上方使用的是一维数组,那么下边使用的是二维数组,这个我想是大多数的想法,来使用这个矩阵来用二维数组来进行存储,然后进行计算,那么想了一下,其实就需要三个数组就行了,一维使用函数保证数据的不丢失我暂且使用全局数组不是指针哈,

第一个数组的作用是为了保存初始值

第二个是起到了计算的作用

第三个是为了输出

其实也是和上述是一个的计时在for的三重循环中的关系是

//比如说是n重矩阵哈

for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            sum2 = 0;
            for (int k = 0; k < n; k++) {
                sum2 += arr[i][k] * arr1[k][j];

// 这个乘一下就可以去得到两个矩阵相乘积后的结果
            }
        }
    }

详细代码再下边,

//二维数组的形式
#include <stdio.h>
#define N 1001
void func(int arr[][N], int n);
int arr1[N][N], arr2[N][N], arr3[N][N];
int main() {
	int i, j, k, temp1, temp2, n, x;
	printf("输入无向图的邻接矩阵的阶数:");
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			scanf("%d", &arr1[i][j]);
		}
	}
	//开始对于数据项的处理
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			temp1 = 0;
			for (k = 0; k < n; k++) {
				temp1 += arr1[i][k] * arr1[k][j]; //符合矩阵的形式
			}
			arr2[i][j] = temp1; //此时让sum1 成为其值的一部分
		}
	} //b[][]此时是二阶的了
	x = n;
	while ((x - 1) > 0) {
		func(arr2, n);
		x--;
	}

	return 0;
}
void func(int arr[][N], int n)
{
	int sum2;
	printf("最终得到%d矩阵的邻接矩阵为:\n", n);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			sum2 = 0;
			for (int k = 0; k < n; k++) {
				sum2 += arr[i][k] * arr1[k][j];
			}
			arr3[i][j] = sum2;
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			printf("%d ", arr3[i][j]);
		printf("\n");
	}
}

若有疑问欢迎留言 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Simulink代码生成: Switch模块及其代码

本文描述Switch模块的建模并研究生成的代码。 文章目录1 Simulink中的Switch模块2 Switch模块建模及代码生成3 Switch模块其他用法3.1 多重Switch3.2 通过标定量Switch4 总结1 Simulink中的Switch模块 在Simulink中Switch模块时非常常见的&#xff0c;通常用于根据一定地条件选…

Python学习笔记(十九)——Matplotlib入门上

目录 Matplotlib简介 导入matplotlib模块 图的参数说明 matplotlib图像组成部分介绍 matplotlib绘图步骤分析 matplotlib实现简单图像 matplotlib画布 画布-plt.figure() 实例 同一画布制作多张图像 创建多个子图 实例 plt.subplots 相关参数 调整subplot周围的间距…

使用HGS算法调整PD控制器增益的无人机动态性能数据——基于启发式的无人机路径跟踪优化(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

【Sentinel 预热加载】

系列文章目录 Sentinel 预热加载 目录 系列文章目录 前言 一、概念解释&#xff1f; 二、使用步骤 1.引入库 2.dashboard 配置 总结 前言 一、概念解释&#xff1f; Warm Up&#xff1a;根据coldFactor&#xff08;冷加载因子&#xff0c;默认3&#xff09;的值&#xff0c;从…

有了 HTTP,为什么还要 RPC?

RPC主要是基于TCP/IP协议的&#xff0c;而HTTP服务主要是基于HTTP协议的&#xff0c;我们都知道HTTP协议是在传输层协议TCP之上的&#xff0c;所以效率来看的话&#xff0c;RPC当然是要更胜一筹啦&#xff01;下面来具体说一说RPC服务和HTTP服务。 OSI网络七层模型 在说RPC和…

Android HIDL和hwservicemanager

HIDL软件包 HIDL 接口软件包位于 hardware/interfaces 或 vendor/ 目录下&#xff08;个别情况除外&#xff09;。顶层 hardware/interfaces 会直接映射到 android.hardware 软件包命名空间&#xff1b;版本是软件包&#xff08;而不是接口&#xff09;命名空间下的子目录。 h…

ALPHA项目的测试电机、性能信息和动态推力近似值数据库(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 按照电机试验的完整性&#xff0c;可以将电机试验分为型式试验、单项目或部分项目试验等&#xff1b;其中型式试验包括产品的性…

【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity与JWT实现权限管控以及登录认证指南

SpringSecurity介绍 SpringSecurity是一个用于Java 企业级应用程序的安全框架&#xff0c;主要包含用户认证和用户授权两个方面&#xff0c;相比较Shiro而言&#xff0c;Security功能更加的强大&#xff0c;它可以很容易地扩展以满足更多安全控制方面的需求&#xff0c;但也相…

刷爆力扣之重复叠加字符串匹配

刷爆力扣之重复叠加字符串匹配 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&…

leetcode10---动态规划

题目地址leetcode10 本题的解题思路 题目中的匹配是一个逐步匹配的过程&#xff0c;我们每次从字符串p中取一个字符出来&#xff0c;有两种可能&#xff0c;一种是取出来字母字符或者‘.’&#xff0c;另外一种是取出来[字符‘*’]组合&#xff0c;他可以在s中匹配任意自然数个…

Vulnhub靶机:LAMPSECURITY_ CTF5

目录介绍信息收集主机发现主机信息探测网站探测敏感信息泄露挂马提权敏感信息收集提权成功介绍 系列&#xff1a;LAMPSecurity&#xff08;此系列共5台&#xff09; 发布日期&#xff1a;2009年5月10日 难度&#xff1a;初 运行环境&#xff1a;VMware Workstation 目标&#…

Canvas学习记录

Canvas学习基本用法1.首先得有canvas元素2.获取渲染上下文3.检查浏览器支持性4.例子绘制图形1.矩形2. 绘制路径3. 移动笔触4. 绘制直线5. 圆弧二次贝塞尔曲线与三次贝塞尔曲线Path2D 对象创建Path2D对象Path2D.addPath()使用样式和颜色色彩Colors透明度 Transparency线型 Line …

oracle DML与DDL

一、数据库语言介绍 DML&#xff08;数据库操作语言&#xff09;&#xff1a;其中包括 insert/delete/update/select等操作。 DDL&#xff08;数据库定义语言&#xff09;&#xff1a;其中包括create/alter/drop等操作。 区别&#xff1a;1、DDL是针对数据库对象(例如&#…

【安全学习】apache通告中的漏洞描述

分析 漏洞描述 我们可以看看在apache通告中对漏洞的简单的描述 很明显&#xff0c;从这个漏洞描述中&#xff0c;我们能够明白这个CVE的造成主要是因为dubbo中内置的hessian项目&#xff0c;主要是因为在中的及以前版本中存在有这个漏洞hessian-lite3.2.12 来看看是因为哪里…

3. 请求

1. 请求映射路径 RequestMapping注解 名称&#xff1a;RequestMapping类型&#xff1a;方法注解 类注解位置&#xff1a;SpringMVC控制器方法定义上方作用&#xff1a;设置当前控制器方法请求访问路径&#xff0c;如果设置在类上统一设置当前控制器方法请求访问路径前缀范例 …

Matter理论介绍-通用-1-03:桥接器-数据结构

【源码、文档、软件、硬件、技术交流、技术支持&#xff0c;入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取&#xff0c;免安装&#xff0c;解压即用】 持续更新中&#xff0c;欢迎关注&#xff01; 一、简介 Bridge&#xff08;桥接器&#xff09;存在的意…

springboot集成webstock实战:服务端数据推送数据到客户端实现实时刷新

背景 之前介绍过springboot集成webstock方式,具体参考: springboot集成websocket实战:站内消息实时推送 这里补充另外一个使用webstock的场景,方便其他同学理解和使用,废话不多说了,直接开始!简单介绍一下业务场景: 现在有一个投票活动,活动详情中会显示投票活动的参与人数…

【代码随想录】二刷-贪心算法

贪心算法 《代码随想录》 什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候&#xff0c;手动模拟一下感觉可以局部最优退出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试贪心。…

Python游戏开发之Dungeon Crawler 游戏源码大全

源码一 功能: WASD 移动 SPACE 攻击 SHIFT 使用楼梯 介绍 每个级别都包含一把钥匙和一个上锁的舱口。收集钥匙以解锁通往下一层的通道(SHIFT解锁)。 史莱姆造成的伤害最小,但每一层都会产生更多。他们可以降低健康或 XP。更多 XP = 每次攻击造成更多伤害。硬币目前没有…

OpenCV 读取、显示和保存图像

目录 一、OpenCV 读取图像 OpenCV 读取函数 参数&#xff1a; 二、OpenCV 显示图像 imshow函数 imshow函数功能 imshow函数原型 三、OpenCV 保存图像 四、结果和代码 一、OpenCV 读取图像 OpenCV 允许我们对图像执行多种操作&#xff0c;但要做到这一点&#xff0c;需…