【matlab】矩阵\cell信息循环统一赋值给不同变量

这个是前天调程序时,终于下决心一解决的一个仿真中经常会遇到的问题,在网上查找了相关的函数,经过调试实现了功能。

问题

之前在做仿真的时候,经常会有需要把一个矩阵或者元胞的不同位置的值,赋值给不同的变量,然后在后续的程序中分别调用,可能有人会觉得为什么不用(x,y)直接调用呢,简单的情况确实可以如此(比如二维矩阵),但是更高维度的呢,如果调用的程序本身就不支持那种语法呢。

原本的办法

繁琐又费神,虽然复制粘贴可以解决一定的问题,但是依旧需要一个一个手动操作,如果遇到大量的数据需要赋值,就只能硬刚了:

%手动赋值,示例程序
%2020年3 月1 日
%Jonny Su
%%矩阵系数初始化
SA = randn(5,5,25); %平衡点的系统矩阵 随机赋值
SB = randn(5,2,25); %平衡点的输入矩阵 随机赋值
%%变量初始化
sA11 = zeros(1,25);
sA12 = zeros(1,25);
sA14 = zeros(1,25);
sA21 = zeros(1,25);
sA24 = zeros(1,25);
sA31 = zeros(1,25);
sA32 = zeros(1,25);
sA41 = zeros(1,25);
sA44 = zeros(1,25);
sA45 = zeros(1,25);
sA51 = zeros(1,25);
sA54 = zeros(1,25);
sB11 = zeros(1,25);
sB21 = zeros(1,25);
sB51 = zeros(1,25);
sB12 = zeros(1,25);
sB22 = zeros(1,25);
sB52 = zeros(1,25);

%%将提取出的值赋值给相应的变量用于拟合
for i = 1:25
    sA11(i) = SA(1,1,i);
    sA12(i) = SA(1,2,i);
    sA14(i) = SA(1,4,i);
    sA21(i) = SA(2,1,i);
    sA24(i) = SA(2,4,i);
    sA31(i) = SA(3,1,i);
    sA32(i) = SA(3,2,i);
    sA41(i) = SA(4,1,i);
    sA44(i) = SA(4,4,i);
    sA45(i) = SA(4,5,i);
    sA51(i) = SA(5,1,i);
    sA54(i) = SA(5,4,i);
    
    sB11(i) = SB(1,1,i);
    sB21(i) = SB(2,1,i);
    sB51(i) = SB(5,1,i);
    sB12(i) = SB(1,2,i);
    sB22(i) = SB(2,2,i);
    sB52(i) = SB(5,2,i);
end

虽然最后也实现了将SA(5 * 5 * 25),SB(5 * 2 * 25)分别赋值给原本状态空间模型的效果,但是工作量大,得一个一个修改数据。

改进后循环赋值

这里就要引出新程序里的关键函数 eval了,我也是搜索了才发现其就是做这个事情的。

官方的帮助文件中给出了详细的说明,这里只提重点:

%格式1
eval(expression)
%评估由expression表示的MATLAB®代码。 
%如果在匿名函数,嵌套函数或包含嵌套函数的函数中使用eval,则求值表达式无法创建变量。
%格式2
[output1,...,outputN] = eval(expression) 	%将表达式的输出存储在指定的变量中。

具体的使用方法,可以参考以下的调用格式,本来我是用在其他地方的,这里正好检验一下掌握水平:

%利用eval函数实现循环赋值,示例程序
%2020年3 月1 日
%Jonny Su
%% 矩阵数据初始化
clear all;
SA = randn(5,5,25); %平衡点的系统矩阵 随机赋值
SB = randn(5,2,25); %平衡点的输入矩阵 随机赋值

%% 循环赋值
%SA
for i = 1:5
%     for j = 1;2           %睁大眼睛好好看看
    for j = 1:5
        for k = 1:25
            eval(['sA',num2str(i),num2str(j),'(k)',' = ',' SA(i,j,k)',';']);
        end
    end
end
%SB
for i = 1:5
%     for j = 1;2           %睁大眼睛好好看看
    for j = 1:2
        for k = 1:25
            eval(['sB',num2str(i),num2str(j),'(k)',' = ',' SB(i,j,k)',';']);
        end
    end
end

上面的程序实现了一样的功能,而且第一段代码还偷懒了没有全部分解,第二段代码直接给出了全部的结果,当然要是扣内存占用等等又是后话了。

具体的思想就是,循环中间的那句:

  1. 首先是变量前缀,用单引号括起来;
  2. 接着是编号,其实也是循环的位置,用格式转换成字符串,用逗号分隔开来;
  3. 然后是需要在每个变量里留下的数据量,这里我需要最后每个变量都是1 * 25),如果是单独赋值,则需要在上一步中增加一串;
  4. 用双引号括起来的’=‘,执行赋值操作;
  5. 原始数据,需要注意引用的格式要和前面被赋值的变量在量级上相同;
  6. 用双引号括起来的’;‘,避免输出,如需直接在命令行查看则去掉。

几个需要注意的地方:

  • 代码循环里注释的地方,这种小错误有时候也是很让人头疼的;
  • eval后面跟的是 ([ ]) ,自己写的时候容易丢三落四;
  • 灵活使用。

结尾

这是第一篇讨论技术的文章,平日里干活用 matlab 比较多,至于python一直是半吊子,找工作用的c也是刚算入门,要努力了。

欢迎讨论,互相学习。

发布了8 篇原创文章 · 获赞 0 · 访问量 1570

猜你喜欢

转载自blog.csdn.net/qq_39295220/article/details/104590184
今日推荐