任意阶魔方阵matlab程序

合集下载

Matlab选修课作nana

Matlab选修课作nana

Matlab选修课作业通信工程11001 张安娜201006091 1.创建n阶魔方矩阵,限定条件是n为能被4整除的偶数。

%所谓魔方矩阵(Magic matrix),是指那矩阵由1到n2的正整数按照一定规则排列而成,并且每列、每行、每条对角线元素的和都等于n(n2+1)/2 。

就生成规则而言,魔方矩阵可分成三类:一,n为奇数;二,n为不能被4整除的偶数;三,n为能被4整除的偶数。

解:程序:clear;clc;while 1n=input('请输入一个能被4整除的正整数!n = ');if mod(n,4)==0breakendendG=logical(eye(4,4)+rot90(eye(4,4)));m=n/4;K=repmat(G,m,m); N=n^2;A=reshape(1:N,n,n);A(K)=N-A(K)+1s0=round(n*(n*n+1)/2);disp([int2str(n),' 阶魔方矩阵的标称和是',int2str(s0)])Ns0=round(2*(n+1));B=A';SC=sum(A); SR=sum(B);Sd=sum(diag(A)); Sdi=sum(diag(B)); LS=[SC,SR,Sd,Sdi]==s0;NS=round(sum(LS));if NS==Ns0disp('经验证,A是魔方矩阵。

')elsedisp('经验证,A不是魔方矩阵。

')end运行结果:请输入一个能被4整除的正整数!n = 8A =64 9 17 40 32 41 49 82 55 47 26 34 23 15 583 54 46 27 35 22 14 5961 12 20 37 29 44 52 560 13 21 36 28 45 53 46 51 43 30 38 19 11 627 50 42 31 39 18 10 6357 16 24 33 25 48 56 18 阶魔方矩阵的标称和是260经验证,A是魔方矩阵。

matlab方块排列代码

matlab方块排列代码

matlab方块排列代码方块排列是一种常见的图像处理和计算机视觉任务,它可以通过将图像分割为不同的方块,并按照一定规则重新排列来改变图像的外观。

在本文中,我们将探讨一些使用MATLAB编程语言实现方块排列的代码。

首先,我们需要加载一张图像作为输入。

我们可以使用MATLAB的imread函数来读取图像文件,该函数返回一个表示图像的矩阵。

例如,我们可以使用以下代码来加载名为"image.jpg"的图像:```image = imread('image.jpg');```接下来,我们需要确定方块的大小和形状。

一种常见的方法是将图像分割为正方形方块,但你也可以使用其他形状,如长方形或五边形。

在本文中,我们将使用正方形方块。

假设我们要将图像分割为NxN个方块,我们可以使用MATLAB的imresize函数来调整图像的大小,使得每个方块的大小为像素值为MxM。

以下是实现这一步骤的代码:```N = 10; % 每行/列的方块数量M = size(image, 1) / N; % 每个方块的像素数量resized_image = imresize(image, [M*N, M*N]);```接下来,我们需要创建一个空的画布来存储重新排列后的方块。

我们可以使用MATLAB的zeros函数创建一个MxMx3的矩阵,其中3表示每个像素的RGB值。

以下是实现这一步骤的代码:```canvas = zeros(M*N, M*N, 3);```现在,我们可以开始对图像进行方块排列。

我们可以使用两个嵌套的for循环来迭代遍历输入图像中的每个方块,并将其复制到我们创建的画布上的相应位置。

以下是实现这一步骤的代码:```for i = 1:Nfor j = 1:Nx = (i - 1) * M + 1;y = (j - 1) * M + 1;canvas(x:x+M-1, y:y+M-1, :) = resized_image((j-1)*M+1:j*M, (i-1)*M+1:i*M, :);endend```最后,我们可以使用MATLAB的imshow函数显示重新排列后的图像。

matlab中magic函数用法

matlab中magic函数用法

matlab中magic函数用法在MATLAB中,magic函数是一个非常有用的函数,用于创建魔方阵。

魔方阵是一个正方形矩阵,其每一行、每一列以及对角线上的元素相加都相等。

magic函数的用法非常简单,只需要一个输入参数n,用于指定魔方阵的维度大小。

下面是一个简单的例子:```matlabA = magic(4);```这个例子中,magic函数创建了一个4x4的魔方阵,并将其赋值给变量A。

可以通过disp函数来显示魔方阵的值:```matlabdisp(A);```输出结果如下:```16231351110897612414151```可以看到,每一行、每一列以及对角线上的元素相加的结果都是34如果需要创建一个更大的魔方阵,只需要将n值传递给magic函数即可。

下面是一个例子:```matlabB = magic(5);disp(B);```输出结果如下:```17241815235714164613202210121921311182529```同样的,每一行、每一列以及对角线上的元素相加的结果都是65除了创建魔方阵,magic函数还可以用于交互式操作。

在MATLAB命令窗口中,输入"magic",然后按下回车键,即可调用magic函数,并在命令窗口中显示魔方阵的值。

magic函数的一个有趣的应用是解决数独游戏。

数独游戏是一个经典的逻辑填字游戏,玩家需要填写一个9x9的矩阵,使得每一行、每一列以及每一个3x3的子矩阵中的数字都是唯一的。

利用魔方阵的性质,可以通过将一个已知的数独矩阵与一个适当的魔方阵相乘,来生成一个新的数独矩阵。

例如```matlabsudoku = magic(3) * magic(3)';disp(sudoku);```在这个例子中,magic(3)生成了一个3x3的魔方阵,然后通过转置操作生成了一个新的魔方阵,将其与原始的魔方阵相乘,得到了一个新的数独矩阵。

实验报告魔方阵程序(3篇)

实验报告魔方阵程序(3篇)

第1篇一、实验目的1. 熟悉Python编程语言的基本语法和常用数据结构。

2. 学习使用嵌套循环实现复杂数据结构的构建。

3. 掌握随机数生成和排序算法在程序中的应用。

4. 提高编程能力和问题解决能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容本实验旨在设计一个魔方阵程序,实现以下功能:1. 生成一个nn的魔方阵。

2. 魔方阵中,每一行的数字之和等于n。

3. 魔方阵中,每一列的数字之和等于n。

4. 魔方阵中,对角线的数字之和等于n。

四、实验步骤1. 导入所需的库```pythonimport random```2. 定义一个函数,用于生成nn的魔方阵```pythondef generate_magic_square(n):初始化一个nn的二维数组,用于存储魔方阵的数字 magic_square = [[0] n for _ in range(n)]num = 1 用于存储当前要填充的数字i, j = 0, n // 2 初始化起始位置while num <= n n:将数字num填充到当前位置magic_square[i][j] = numnum += 1判断下一个位置new_i, new_j = (i - 1) % n, (j + 1) % n 如果当前位置已被填充,则移动到新位置if magic_square[new_i][new_j] != 0:i, j = (i + 1) % n, jelse:i, j = new_i, new_jreturn magic_square```3. 定义一个函数,用于检查魔方阵是否正确```pythondef check_magic_square(magic_square, n):检查每一行的数字之和是否等于nfor i in range(n):if sum(magic_square[i]) != n:return False检查每一列的数字之和是否等于nfor j in range(n):if sum(magic_square[i][j] for i in range(n)) != n:return False检查对角线的数字之和是否等于nif sum(magic_square[i][i] for i in range(n)) != n or sum(magic_square[i][n - i - 1] for i in range(n)) != n:return Falsereturn True```4. 主函数```pythondef main():n = int(input("请输入魔方阵的阶数:"))magic_square = generate_magic_square(n)if check_magic_square(magic_square, n):for row in magic_square:print(' '.join(map(str, row)))else:print("生成的魔方阵不正确!")```5. 运行程序```pythonif __name__ == "__main__":main()```五、实验结果当输入阶数n为5时,程序输出如下魔方阵:```1 2 3 4 512 13 14 15 1011 16 17 18 196 7 8 9 205 4 3 2 1```六、实验总结通过本次实验,我们成功设计并实现了一个魔方阵程序。

魔方矩阵magic square (C语言程序)

魔方矩阵magic square (C语言程序)

/*#include<stdio.h>#define N 7*/#include<iostream>using namespace std;int main(){int N;cout<<"请输入魔方矩阵的阶数N:"<<endl;cin>>N;int matrix[N][N];int row,col;int i,m,n;//0.初始化数组元素全部为0for(row=0;row<N;row++){for(col=0;col<N;col++){matrix[row][col]=0;}}//1.定位1的初始位置row=0;col=(N-1)/2;matrix[row][col]=1;//2.将2...N*N每个数插入到相应位置for(i=2;i<=N*N;i++){int r,c;r=row;c=col;row=(row+N-1)%N; //行列坐标的计算,算法难点。

col=(col+N+1)%N; //后一个数位于前一个数的上一行下一列if(0==matrix[row][col]) //该处无数,无冲突,直接插入该数matrix[row][col]=i;else //此处已经插入了树,则插入到这个位置的下一行{r=(r+1)%N;matrix[r][c]=i;row=r; //重新定位此时的行和列数col=c;}}//3.输出魔方矩阵printf("\n%d阶魔方矩阵如下:\n",N);for(m=0;m<=N;m++){printf("===="); //每个位置占用4个字节}printf("\n");for(m=0;m<N;m++){for(n=0;n<N;n++)printf("%4d",matrix[m][n]); //%4d输出占用4个字节的空间,不足部分用空格在左侧补齐。

matlab方块排列方式代码

matlab方块排列方式代码

Matlab方块排列方式代码一、概述Matlab是一种强大的数值计算软件,它可以用于矩阵计算、数据分析、绘图和算法开发等多个领域。

在Matlab中,方块排列方式代码是一种常见的问题,它涉及到如何将一系列方块以特定的方式排列在一起。

在本文中,我将从简单到复杂地介绍Matlab中方块排列方式的代码,希望能帮助读者更深入地理解这一问题。

二、基本概念在Matlab中,方块排列方式代码通常涉及到矩阵的操作。

假设我们有一个n×n的方块矩阵,我们需要编写代码来实现不同的排列方式。

其中,常见的排列方式包括螺旋排列、对角线排列、随机排列等。

在下面的代码示例中,我将演示如何实现这些排列方式。

1. 螺旋排列螺旋排列是将方块从外向内呈螺旋状排列的方式。

在Matlab中,我们可以使用循环来实现螺旋排列的代码。

具体实现方式如下:```matlabn = 5; % 方块矩阵的大小A = zeros(n); % 创建一个n×n的零矩阵m = 1; % 初始值i = 1; j = 1; % 起始位置while m <= n^2while j <= n && A(i, j) == 0 % 向右移动 A(i, j) = m;j = j + 1;m = m + 1;endj = j - 1;i = i + 1;while i <= n && A(i, j) == 0 % 向下移动 A(i, j) = m;i = i + 1;m = m + 1;endi = i - 1;j = j - 1;while j >= 1 && A(i, j) == 0 % 向左移动 A(i, j) = m;j = j - 1;m = m + 1;endj = j + 1;i = i - 1;while i >= 1 && A(i, j) == 0 % 向上移动A(i, j) = m;i = i - 1;m = m + 1;endi = i + 1;j = j + 1;enddisp(A); % 打印螺旋排列的矩阵```通过上述代码,我们可以得到一个5×5的螺旋排列矩阵。

matlab 2-2

matlab 2-2

32
23
MATLAB @SDU
14
(3) 矩阵除法 在MATLAB中,有两种矩阵除法运算:\和/,分 别表示左除和右除。如果A矩阵是非奇异方阵, 则A\B和B/A运算可以实现。A\B等效于A的逆左 乘B矩阵,也就是inv(A)*B,而B/A等效于A矩阵 的逆右乘B矩阵,也就是B*inv(A)。 对于含有标量的运算,两种除法运算的结果相同, 如3/4和4\3有相同的值,都等于0.75。又如,设 a=[10.5,25],则a/5=5\a=[2.1000 5.0000]。对于矩 阵来说,左除和右除表示两种不同的除数矩阵和
MATLAB @SDU
11
矩阵加减运算
假定有两个矩阵A和B,则可以由A+B和 A-B实现矩阵的加减运算。运算规则是: 若A和B矩阵的维数相同,则可以执行矩阵 的加减运算,A和B矩阵的相应元素相加减。 如果A与B的维数不相同,则MATLAB将 给出错误信息,提示用户两个矩阵的维数 不匹配。
MATLAB @SDU
第二章 MATLAB 数值计算
MATLAB @SDU
1
用于专门学科的特殊矩阵 (1) 魔方矩阵 魔方矩阵有一个有趣的性质,其每行、每 列及两条对角线上的元素和都相等。对于 n阶魔方阵,其元素由1,2,3,…,n2共n2个整 数组成。MATLAB提供了求魔方矩阵的函 数magic(n),其功能是生成一个n阶魔方阵。
MATLAB @SDU
16
a=[1,2,3;4,5,6;7,8,9];a^2 ans =30 36 42
66 81 96 102 126 150
※当一个方阵有复数特征值或负实 特征值时,非整数幂是复数阵。
MATLAB @SDU
17
a^0.5

matlab实验

matlab实验

实验一1、计算y=x^3+(x-0.98)^2/(x+1.35)^3-5*(x+1/x)当x=2,x=4的值。

2、计算cos(pi/3)-(9-2^(1/2))^(1/3)。

3、已知a=3,A=4,b=a^2,B=b^2-1,c=a+2*B+c,求C。

4、创建一个3*3矩阵,然后用矩阵编辑器将其扩充为4*5矩阵。

5、创建一个4*4矩阵魔方阵和相应的随机矩阵,将两个矩阵并接起来,然后提取任意两个列向量。

7设A=[1,4,8,13;-3,6,-5,-9;2,-7,-12,-8],B=[5,4,3,-2;6,-2,3,-8;-1,3,-9,7],求C=A*B’,D=A.*B。

8、求(s^2+2)(s+4)(s+1)/(s^3+s+1)的“商”及“余”多项式。

9、建立矩阵A,然后找出在[10,20]q区间的元素的位置。

10、创建一个有7个元素的一维数组,并做如下处理:1)直接访问一位数组的第6个元素;2)寻访一维数组的第1、3、5个元素;3)寻访一维数组中的第4个至最后1个元素;4)寻访一维数组中大于70的元素。

三、实验程序:NO.1>> x=[2,4]x = 2 4>> y=x.^3+(x-0.98).^2/(x+1.35).^3-5*(x+1./x)y =-4.4423 42.8077>>NO.2>> cos(pi/3)-(9-sqrt(2))^(1/3) ans =-1.4649>>3>> a=3a =NO. 3>> A=4A =4>> b=a^2b =9>> B=b^2-1B =80>> c=a+A-2*Bc =-153>> C=a+2*B+cC =10NO..4A=rand(3)A =0.5341 0.8385 0.70270.7271 0.5681 0.54660.3093 0.3704 0.4449>> B=rand(3,2)B =0.6946 0.95680.6213 0.52260.7948 0.8801>> C=rand(1,5)C =0.1730 0.9797 0.2714 0.2523 0.8757 >> F=[A,B;C]F =0.5341 0.8385 0.7027 0.6946 0.95680.7271 0.5681 0.5466 0.6213 0.52260.3093 0.3704 0.4449 0.7948 0.88010.1730 0.9797 0.2714 0.2523 0.8757 NO.5>> A=magic(4)A =16 2 3 135 11 10 89 7 6 124 14 15 1>> B=rand(3,4)B =0.7373 0.8939 0.6614 0.06480.1365 0.1991 0.2844 0.98830.0118 0.2987 0.4692 0.5828 >> C=[A;B]C =16.0000 2.0000 3.0000 13.00005.0000 11.0000 10.0000 8.00009.0000 7.0000 6.0000 12.00004.0000 14.0000 15.0000 1.00000.7373 0.8939 0.6614 0.06480.1365 0.1991 0.2844 0.98830.0118 0.2987 0.4692 0.5828 >> C(:,[1,2])ans =NO.6>> A=[-4,-2,0,2,4;-3,-1,1,3,5]A =-4 -2 0 2 4-3 -1 1 3 5>> LA=abs(A)>3LA =1 0 0 0 10 0 0 0 1>> A(LA)ans =-445>>NO.7>> A=[1,4,8,13;-3,6,-5,-9;2,-7,-12,-8]A =1 4 8 13-3 6 -5 -92 -7 -12 -8>> B=[5,4,3,-2;6,-2,3,-8;-1,3,-9,7]B =5 4 3 -26 -2 3 -8-1 3 -9 7>> C=A*B'C =19 -82 3012 27 3-38 54 29>> D=A.*BD =5 16 24 -26-18 -12 -15 72-2 -21 108 -56>>NO.8>> den=conv([1,0,2],conv([1,4],[1,2])) den =1 6 10 12 16 num=[1,0,1,1];>> [q,r]=deconv(den,num)q =1 6r =0 0 9 5 10>>NO.9>> A=[10,15,8;5,16,35;16,8,26]A =10 15 85 16 3516 8 26>> (A>=10)&(A<=20)ans =1 1 00 1 01 0 0>>NO.10x =1 2 3 4 5 6 7 >> x(1)ans =1>> x(3)ans =3>> x(5)ans = 5>> x(4:end)ans = 4 5 6 7>> x(x>70)ans =Empty matrix: 1-by-0>>实验二1. 设()23sin cos 0.51x y x x ⎡⎤⎢⎥=++⎢⎥⎣⎦,把0~2x π=区间分为125点,画出以x 为横坐标,y 为纵坐标的曲线。

c++ 奇数 魔方阵 最简单 代码 算法 实训

c++ 奇数 魔方阵 最简单 代码 算法 实训

c++ 奇数魔方阵最简单代码算法实训以下是C++实现奇数阶魔方阵的简单代码:c#include<iostream>using namespace std;void magicSquare(int n) {int magic[n][n];int sum = n * (n * n + 1) / 2; // 奇数阶魔方阵的对角线元素之和int count = 1; // 计数器,记录当前填入的数字for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {magic[i][j] = 0; // 初始化矩阵为0}}magic[0][0] = 1; // 将第一个元素填为1for (int i = 1; i < n; i++) {for (int j = 0; j < n; j++) {if (magic[i-1][j] == 0) { // 如果上一行对应位置为0,则填入下一个数字magic[i][j] = count++;} else { // 否则填入上一个数字的对称位置magic[i][j] = -magic[i-1][j];}}}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cout << magic[i][j] << " "; // 输出矩阵中的元素}cout << endl;}}int main() {int n;cout << "请输入奇数阶数:";cin >> n;magicSquare(n);return0;}该算法的基本思路是:首先计算出奇数阶魔方阵的对角线元素之和,然后从第一个元素开始,按照一定的规则填入数字,直到填满整个矩阵。

matlab解魔方设计

matlab解魔方设计

3. 程序截图:
(图一)开始界面
(图二)输入指导界面
(图三)等待运算界面
(图四)开始旋转
(图五)第一层十字
(图六)十字旋转完毕
(图七)第一层旋转完毕
(图八)第二层旋转完毕
(图九)旋转第三层十字
(图十)第三层边块复位
(图十一)旋转完毕(由于图片滞留原因白色滞留在蓝色位置上,经检验, 魔方已经完美还原)
转法:
右- 上- 前- 上+
前+
右+
公式 C
C
C

上2
C

进阶学习

:右- 前- 上- 前+ 上+ 右+。
(四) 顶层角块定位。 使角块处在各自正确的位置上,而不用考虑角块的颜色方向.通过转动 顶层,必定能出现下述两种情形之一:
转法: 右公式 D
5.缺陷分析: 1)计算时间长 由于对魔方的了解不够深入,我们选择的是比较麻烦的层 先法,因此解出的并不是一个最简的步骤(理论上一切魔方都会 在 26 步以内还原) ,其中会走很多曲折的道路,虽然层先法的实 现相对简单,但是会耗费更多的时间。 还有一种可能性是我们的子程序会进行大量的调用,也许 会占用部分的时间。 2)输入程序没有删除键 假如运行者不小心出现输入错误,他就不得不重新运行程 序再次输入。使得程序不太人性化。 3)对于输入没有完整的查错程序 虽然程序中会有部分的错误提示,但是由于程序比较庞大, 我们无法充分的考虑到所有的可能输入错误。 4)动态演示过程不能控制快慢不能控制视角不能暂停 动态过程的控制可以通过修改 MYPLOTCUBE.M 子文件中 的暂停值以及步长值来实现快慢以及暂停的控制; 对于视角控制 我们考虑可以通过 view 语句来进行实现。 5)动态运行图像存在严重的滞留 我们的程序是由 fill3,pause 以及 delete 语句来实现其动 态模拟,因此画图的本质是魔方块的六个面依次画,再一个一个

matlab 矩阵运算程序

matlab 矩阵运算程序

matlab 矩阵运算程序摘要:1.MATLAB 简介2.MATLAB 矩阵运算的基本概念3.MATLAB 矩阵运算的实例4.MATLAB 矩阵运算的优点正文:1.MATLAB 简介MATLAB(Matrix Laboratory)是一款广泛应用于科学计算、数据分析、可视化等领域的编程软件。

它以矩阵计算为核心,为用户提供了丰富的函数库和强大的矩阵运算能力。

MATLAB 可以进行各种矩阵运算,包括矩阵加法、乘法、转置、求逆等,使得矩阵计算变得更加简单、快速。

2.MATLAB 矩阵运算的基本概念在MATLAB 中,矩阵运算通常涉及到以下几个基本概念:- 矩阵:MATLAB 中的矩阵是一个二维数组,可以用来表示线性方程组、线性变换等数学概念。

- 单位矩阵:单位矩阵是一个方阵,其中主对角线上的元素都是1,其余元素都是0。

单位矩阵的作用类似于数学中的1,即任何矩阵与单位矩阵相乘,结果仍为原矩阵。

- 零矩阵:零矩阵是一个所有元素都是0 的矩阵,通常用0 表示。

- 矩阵的转置:将一个矩阵的行和列互换,得到一个新的矩阵,这个新矩阵称为原矩阵的转置。

- 矩阵的逆矩阵:对于一个可逆矩阵,存在一个矩阵,使得两者相乘等于单位矩阵。

这个矩阵称为原矩阵的逆矩阵。

3.MATLAB 矩阵运算的实例下面通过一个简单的实例,介绍如何在MATLAB 中进行矩阵运算。

假设有一个2x3 的矩阵A:```A = [1, 2, 3;4, 5, 6];```我们可以进行以下矩阵运算:- 矩阵加法:```B = 2 * A;C = A + B;```- 矩阵乘法:```D = A * B;```- 矩阵转置:```E = A";```- 矩阵求逆:```F = AB;```4.MATLAB 矩阵运算的优点MATLAB 矩阵运算具有以下优点:- 简单易用:MATLAB 提供了丰富的矩阵运算函数,用户只需调用相应的函数,即可完成复杂的矩阵运算。

简述matlab矩阵操作方法

简述matlab矩阵操作方法

简述matlab矩阵操作方法
Matlab中矩阵的操作方法非常丰富,以下是一些常见的操作方法:
1.创建矩阵:可以通过直接输入矩阵元素、读入文件、随机生成等方法创建矩阵,例如:
a = [1 2 3; 4 5 6; 7 8 9]; % 直接输入矩阵元素
b = importdata('data.txt'); % 从文件读入矩阵
c = rand(3, 4); % 随机生成3行4列的矩阵
2.矩阵运算:Matlab中支持矩阵加减乘除、点乘点除、转置、逆矩阵、求秩等运算,例如:
d = a + b; % 矩阵加法
e = a * b; % 矩阵乘法
f = a .* b; % 点乘
g = a' % 转置
h = inv(a); % 求逆
i = rank(a); % 求秩
3.矩阵索引:可以使用行列索引、范围索引、逻辑索引等方式来访问矩阵元素,例如:
a(2,3) % 访问第2行第3列元素
a(2,:) % 访问第2行所有元素
a(:,1:2) % 访问第1、2列所有元素
a(a>5) % 访问大于5的元素
4.矩阵处理:通过循环、判断、函数等方式对矩阵进行处理,例如:
for i=1:size(a,1)
for j=1:size(a,2)
if a(i,j)>5
a(i,j) = a(i,j) * 2;
end
end
end
以上是一些常见的矩阵操作方法,Matlab还有很多其他的用法,需要根据具体情况来使用。

任意阶魔方阵算法(c语言)

任意阶魔方阵算法(c语言)

任意阶魔方阵算法2009-03-19 11:45:00| 分类:我的文章|字号大中小订阅我一直就对魔方阵很感兴趣,特别是知道了奇数阶魔方阵的罗伯特算法后,就特别想知道偶数阶魔方阵应有什么算法。

当时书上说偶数阶魔方阵比较复杂。

都没有什么说明。

因此这个问题一直搁在我心里很久,已差不多快忘记了。

今天突然又想到了这个问题。

于是我开始在网上搜寻,看能不能找到什么好的算法。

记得在高中的时候,我就做过魔方阵,当时我从三阶一直做到过八阶方阵,不过用的是人工的方法。

到大学的时候我知道了罗伯特算法后,我就用程序将算法写了出来。

于是我今天准备把偶数阶的魔方阵也写出来。

在网上终于找到了一个比较好的算法。

将该算法用C写了出来。

供大家分亨。

1、奇数阶幻方n为奇数(n=3,5,7,9,11……) (n=2*k+1,k=1,2,3,4,5……)奇数阶幻方最经典的填法是罗伯特法(也有人称之为楼梯方)。

填写方法是这样:把1(或最小的数)放在第一行正中;按以下规律排列剩下的n*n-1个数:(1)、每一个数放在前一个数的右上一格;(2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;(3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;(4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;(5)、如果这个数所要放的格已经有数填入,处理方法同(4)。

这种写法总是先向“右上”的方向,象是在爬楼梯。

2、双偶阶幻方n为偶数,且能被4整除(n=4,8,12,16,20……) (n=4k,k=1,2,3,4,5……)先说明一个定义:互补:如果两个数字的和,等于幻方最大数和最小数的和,即n*n+1,称为互补。

先看看4阶幻方的填法:将数字从左到右、从上到下按顺序填写:1 2 3 45 6 7 89 10 11 1213 14 15 16这个方阵的对角线,已经用蓝色标出。

MATLAB命令大全和矩阵操作大全

MATLAB命令大全和矩阵操作大全

MATLAB命令大全和矩阵操作大全 -dengjianqiang2011的专栏 - 博客频道 -MATLAB矩阵操作大全一、矩阵的表示在MATLAB中创建矩阵有以下规则:a、矩阵元素必须在”[ ]”内;b、矩阵的同行元素之间用空格(或”,”)隔开;c、矩阵的行与行之间用”;”(或回车符)隔开;d、矩阵的元素可以是数值、变量、表达式或函数;e、矩阵的尺寸不必预先定义。

二,矩阵的创建:1、直接输入法最简单的建立矩阵的方法是从键盘直接输入矩阵的元素,输入的方法按照上面的规则。

建立向量的时候可以利用冒号表达式,冒号表达式可以产生一个行向量,一般格式是: e1:e2:e3,其中e1为初始值,e2为步长,e3为终止值。

还可以用linspace函数产生行向量,其调用格式为:linspace(a,b,n) ,其中a和b是生成向量的第一个和最后一个元素,n是元素总数。

2、利用MATLAB函数创建矩阵基本矩阵函数如下:(1) ones()函数:产生全为1的矩阵,ones(n):产生n*n维的全1矩阵,ones(m,n):产生m*n维的全1矩阵;(2) zeros()函数:产生全为0的矩阵;(3) rand()函数:产生在(0,1)区间均匀分布的随机阵;(4) eye()函数:产生单位阵;(5) randn()函数:产生均值为0,方差为1的标准正态分布随机矩阵。

3、利用文件建立矩阵当矩阵尺寸较大或为经常使用的数据矩阵,则可以将此矩阵保存为文件,在需要时直接将文件利用load命令调入工作环境中使用即可。

同时可以利用命令reshape 对调入的矩阵进行重排。

reshape(A,m,n),它在矩阵总元素保持不变的前提下,将矩阵A重新排成m*n的二维矩阵。

二、矩阵的简单操作1.获取矩阵元素可以通过下标(行列索引)引用矩阵的元素,如 Matrix(m,n)。

也可以采用矩阵元素的序号来引用矩阵元素。

矩阵元素的序号就是相应元素在内存中的排列顺序。

C语言魔方阵的三种实现方法

C语言魔方阵的三种实现方法

C语⾔魔⽅阵的三种实现⽅法⽬录魔⽅阵:1.奇数阶魔⽅阵2.偶数阶魔⽅阵(n=4K)3.偶数阶魔⽅阵(n=4K+2)魔⽅阵:把1到n*n排成n⾏n列⽅阵,使⽅阵中的每⼀⾏、每⼀列以及对⾓线上的数之和都相同,即为n阶魔⽅阵。

根据魔⽅阵的规律,我将它分为三种情况。

1.奇数阶魔⽅阵规律:第⼀个数放在第⼀⾏的中间,下⼀个数放在上⼀个数的上⼀⾏下⼀列,若该位置已经有了数字即放在上个数的下⾯⼀⾏的相同列⽤C语⾔编程如下:⽰例:n=5;#include<stdio.h>#include<stdlib.h>#include<assert.h>void Magic1(){#define ROW 5#define COL ROWassert(ROW % 2 != 0); //判断n是否为奇数int arr[ROW][COL] = { 0 }; //定义⼆维数组int currow = 0;int curcol = COL / 2;arr[currow][curcol] = 1;for (int i = 2; i <= ROW * COL; i++){if (arr[(currow - 1 + ROW) % ROW][(curcol + 1) % COL] == 0) //按照规律赋值{currow = (currow - 1 + ROW) % ROW;curcol = (curcol + 1) % COL;}else{currow = (currow + 1) % ROW;}arr[currow][curcol] = i;}for (int i = 0; i < ROW; i++) //打印魔⽅阵{for (int j = 0; j < COL; j++){printf("%-3d", arr[i][j]);}printf("\n");}}int main(){Magic1();return 0;}结果:2.偶数阶魔⽅阵(n=4K)规律:按数字从⼩到⼤,即1,2,3……n顺序对魔⽅阵从左到右,从上到下进⾏填充;将魔⽅阵分成若⼲个4×4⼦⽅阵(如:8阶魔⽅阵可分成四个4×4⼦⽅阵),将⼦⽅阵对⾓线上的元素取出;将取出的元素按从⼤到⼩的顺序依次填充到n×n⽅阵的空缺处。

n阶魔阵程序源代码

n阶魔阵程序源代码

#include "stdafx.h"#include <vector>using namespace std;void OddMagicSquare(vector<vector<int> > &matrix, int n);void DoublyEvenMagicSquare(vector<vector<int> > &matrix, int n);void SinglyEvenMagicSquare(vector<vector<int> > &matrix, int n);void MagicSquare(vector<vector<int> > &matrix, int n); void PrintMagicSquare(vector<vector<int> > &matrix, int n);int main(int argc, char* argv[]){int n;printf("Enter order of square: ");scanf("%d", &n);vector<vector<int> > matrix(n, vector<int> (n, 0));if (n<3){printf("\nError: n must be greater than 2\n\n");return -1;}MagicSquare(matrix, n);//Print resultsPrintMagicSquare(matrix, n);return 0;}void MagicSquare(vector<vector<int> > &matrix,int n) {if (n%2==1) //n is OddOddMagicSquare(matrix, n);else //n is evenif (n%4==0) //doubly even orderDoublyEvenMagicSquare(matrix, n);else //singly even orderSinglyEvenMagicSquare(matrix, n);}void OddMagicSquare(vector<vector<int> > &matrix, int n){int nsqr = n * n;int i=0, j=n/2; // start positionfor (int k=1; k<=nsqr; ++k){matrix[i][j] = k;i--;j++;if (k%n == 0){i += 2;--j;}else{if (j==n)j -= n;else if (i<0)i += n;}}}void DoublyEvenMagicSquare(vector<vector<int> > &matrix, int n){vector<vector<int> > I(n, vector<int> (n, 0));vector<vector<int> > J(n, vector<int> (n, 0));int i, j;//prepare I, Jint index=1;for (i=0; i<n; i++)for (j=0; j<n; j++){I[i][j]=((i+1)%4)/2;J[j][i]=((i+1)%4)/2;matrix[i][j]=index;index++;}for (i=0; i<n; i++)for (j=0; j<n; j++){if (I[i][j]==J[i][j])matrix[i][j]=n*n+1-matrix[i][j];}}void SinglyEvenMagicSquare(vector<vector<int> > &matrix, int n){int p=n/2;vector<vector<int> > M(p, vector<int> (p, 0)); MagicSquare(M, p);int i, j, k;for (i=0; i<p; i++)for (j=0; j<p; j++){matrix[i][j]=M[i][j];matrix[i+p][j]=M[i][j]+3*p*p;matrix[i][j+p]=M[i][j]+2*p*p;matrix[i+p][j+p]=M[i][j]+p*p; }if (n==2)return;vector<int> I(p, 0);vector<int> J;for (i=0; i<p; i++)I[i]=i+1;k=(n-2)/4;for (i=1; i<=k; i++)J.push_back(i);for (i=n-k+2; i<=n; i++)J.push_back(i);int temp;for (i=1; i<=p; i++)for (j=1; j<=J.size(); j++){temp=matrix[i-1][J[j-1]-1];matrix[i-1][J[j-1]-1]=matrix[i+p-1][J[j-1]-1];matrix[i+p-1][J[j-1]-1]=temp;}//j=1, i//i=k+1, k+1+pi=k;j=0;temp=matrix[i][j]; matrix[i][j]=matrix[i+p][j]; matrix[i+p][j]=temp;j=i;temp=matrix[i+p][j]; matrix[i+p][j]=matrix[i][j]; matrix[i][j]=temp;}void PrintMagicSquare(vector<vector<int> > &matrix, int n){for (int i=0; i<n; i++){for (int j=0; j<n; j++)printf(" %3d", matrix[i][j]);printf("\n");}printf("\n\n");}。

MatLab的矩阵操作

MatLab的矩阵操作

矩阵的操作MATLAB将数值都当作矩阵处理,常用的矩阵函数如表1所示。

向量可当作1行或1列的矩阵,标量可当作1行1列的矩阵。

通过魔方矩阵说明矩阵的操作。

表1 MATLAB矩阵形成函数常用矩阵操作的函数如表2所示,常用矩阵计算的函数如表3所示。

窗口操作常用于检验一些指令和函数的用法。

表2 常用矩阵操作的函数表3 常用矩阵计算的函数{范例5_1}魔方矩阵的操作和图示[操作]在命令窗口输入EDU>> M=magic(3)M =8 1 63 5 74 9 2这是3阶魔方(幻方)矩阵。

同理可得高阶魔方。

用求和函数EDU>> sum(M)ans =15 15 15可知每列的和相等。

再用求和函数EDU>> sum(M,2)ans =1515 15可知每行的和相等。

用对角线函数 EDU>> diag(M) ans = 8 5 2可知:对角线函数可将矩阵的对角线排成列向量。

再用对角线函数 EDU>> diag(ans) ans =8 0 0 0 5 0 0 0 2可知:对角线函数可将列向量排成列对角矩阵。

将求和函数和对角线函数结合使用 EDU>> sum(diag(M)) ans = 15可知:对角线元素的和与各行(列)的和相等。

用求迹函数 EDU>> trace(M) ans = 15也能计算出同一结果。

将矩阵旋转90度 EDU>> MM=rot90(M) MM =6 7 2 1 5 9 8 3 4 再用求迹函数 EDU>> trace(MM) ans = 15可知:副对角线元素的和也与各行(列)的和相等。

这就是魔方的“魔力”。

从1到n 2的数组成等差数列,其和为S = 1 + 2 + … + n 2= 22(1)2n n +每一行或每一列有n 数,如果每一行或每一列的数之和相等,其值为2(1)2S n n s n +==[程序]P5_1magic.m 如下。

MATLAB仿真技术

MATLAB仿真技术

MATLAB仿真技术作业合集页脚内容1页脚内容1第1章 习题5.利用直接输入法和矩阵编辑器创建矩阵A=⎥⎦⎤⎢⎣⎡642531。

解:⑴利用直接输入法输入程序A=[1 3 5;2 4 6]按Enter 键后,屏幕显示A = 1 3 52 4 6⑵用矩阵编辑器创建矩阵,如图1.1所示。

图1.1 MATLAB 编辑器7.用矩阵编辑器创建矩阵a,使a 具有如下矩阵形式。

页脚内容2a=⎥⎦⎤⎢⎣⎡642531⇒a=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡654321⇒a=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡987654321⇒a=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡098706540321⇒a=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡0000098706540321 解:用矩阵编辑器创建矩阵a 的过程如图1.2、1.3、1.4、1.5、1.6所示。

图1.2 图1.3图1.4 图1.5图1.6页脚内容39.已知矩阵B=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡922518113211912102201304161475231501017,试:①提取矩阵B 的第一行和第二行的第2、4、5个元素组成新矩阵1B ;②提取矩阵B 的第三行和第一行的全部元素组成新矩阵2B ;③使矩阵B 的第一行和第三行的第2;4个元素为0;④标出矩阵B 的第一行中小于5的元素。

解:①如上题,用矩阵编辑器生成矩阵B ,再输入程序B1=B([1,2],[2,4,5])按Enter 键后,屏幕显示B1 = 0 0 155 14 16②输入程序B2=B([1,3],:)按Enter 键后,屏幕显示B2 = 17 0 1 0 15 4 0 13 0 22③第一行和第三行的第2;4个元素原本就为0。

④输入程序如下C=B(1,:)<5; %将B矩阵第一行中小于5 的值标记为1D=B(1,C) %去B矩阵第一行中标为1的元素按Enter键后,屏幕显示D= 0 1 011.已知矩阵a为4阶魔方阵,令a+3赋值给b,a+b赋值给c,求b和c。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

function magiccube
sign=1;sign2=1;sign3=1;sign4=1;
while(1)
n=input('Please input the number you want:or you can input 0 to quit the action:');
if n==0
break;
end
if n<0
n=input('You have input a wrong number,Please input the number again:');
end
m=zeros(n);
if mod(n,4)==0 %算n为4的倍数的魔方阵
for i=1:n/2
sign6=1;
if sign3>0&&sign4==1&&sign6==1
sign3=sign3-1;sign6=0;
if sign3==0
sign4=0;
sign3=2;
end
for j=1:n
sign5=1;
if sign>0&&sign2==1&&sign5==1
sign=sign-1;sign5=0;
if sign==0
sign=2;
sign2=0;
end
m(n-i+1,j)=n*i-j+1;
m(i,n-j+1)=n^2+1-m(n-i+1,j);
end
if sign>0&&sign2==0&&sign5==1
sign=sign-1;sign5=0;
if sign==0
sign=2;
sign2=1;
end
m(i,n-j+1)=n*i-j+1;
m(n-i+1,j)=n^2+1-m(i,n-j+1);
end
end
end
if sign3>0&&sign4==0&&sign6==1
sign3=sign3-1;sign6=0;
if sign3==0
sign4=1;
sign3=2;
end
for j=1:n
sign5=1;
if sign>0&&sign2==1&&sign5==1
sign=sign-1;sign5=0;
if sign==0
sign=2;
sign2=0;
end
m(i,j)=n*(i-1)+j;
m(n-i+1,n-j+1)=n^2+1-m(i,j);
end
if sign>0&&sign2==0&&sign5==1
sign=sign-1;sign5=0;
if sign==0
sign=2;
sign2=1;
end
m(n-i+1,n-j+1)=n*(i-1)+j;
m(i,j)=n^2+1-m(n-i+1,n-j+1);
end
end
end
end
m
end
if mod(n,2)==1 %算n为奇数的魔方阵
m=zeros(n+1,n+1);
m(1,:)=-1;
m(:,n+1)=-1;
b=2;c=fix((n+1)/2);
m(b,c)=1;
for i=2:n^2
sign7=1;
if m(b-1,c+1)==0&&sign7==1
m(b-1,c+1)=m(b,c)+1;
b=b-1;c=c+1;sign7=0;
end
if m(b-1,c+1)~=-1&&m(b-1,c+1)~=0&&sign7==1 m(b+1,c)=m(b,c)+1;
b=b+1 ;
c=c;
sign7=0;
end
if m(b-1,c+1)==-1&&m(b-1,c)==-1&&m(b,c+1)==-1&&sign7==1
m(b+1,c)=m(b,c)+1;
b=b+1;c=c;sign7=0;
end
if m(b-1,c+1)==-1&&m(b-1,c)==-1&&sign7==1
a44=m(b-1,c+1);
a444=m(b-1,c);
m(n+1,c+1)=m(b,c)+1;
b=n+1;c=c+1;sign7=0;
end
if m(b-1,c+1)==-1&&m(b,c+1)==-1&&sign7==1 m(b-1,1)=m(b,c)+1;
b=b-1;c=1;sign7=0;
end
end
m(2:n+1,1:n)
end
if mod(n,2)==0&&mod(n,4)~=0 %算n为非4的倍数的偶数阶魔方阵
u=n/2;
v=(n/2-1)/2;
a=magic(n/2); %因前面算法已经算出奇数阶魔方阵,此处直接调用系统函数
b=magic(n/2)+u*u;
c=magic(n/2)+2*u*u;
d=magic(n/2)+3*u*u;
if v>=1
for i=1:v
mid=a(:,i);
a(:,i)=d(:,i);
d(:,i)=mid;
if i>=2
mid=b(:,u-i+2);
b(:,u-i+2)=c(:,u-i+2);
c(:,u-i+2)=mid;
end
end
mid2=a((u+1)/2,1);
a((u+1)/2,1)=d((u+1)/2,1);
d((u+1)/2,1)=mid2;
mid3=a((u+1)/2,(u+1)/2);
a((u+1)/2,(u+1)/2)=d((u+1)/2,(u+1)/2);
d((u+1)/2,(u+1)/2)=mid3;
end
m=[a,c;d,b]
end
end。

相关文档
最新文档